在TFS2008中重新分支一个分支

Mar*_*ath 4 merge tfs branch

假设我在TFS中有分支A,我从中获取分支B.在B上进行一些更改集,然后从B中获取分支C,并对分支C进行更多更改

A ------------------------------
     |
B    ----1--2------------------
                 |
C                ----3-----4---
Run Code Online (Sandbox Code Playgroud)

现在假设我们想要从C合并到A中,但是绕过B.TFS将不允许这样做 - 我必须进行无基础合并,这可能非常容易出错.真的,我想让C"重新定义"(如果这是正确的术语)所以它是A的孩子,而不是B.换句话说,我想最终得到以下分支结构.(C'可以是原始的C分支,也可以是C应该是的新分支).

A ------------------------------
     |   |
B    |   ----1--2------------------
     |           
C'   |-------1--2----3-----4---
Run Code Online (Sandbox Code Playgroud)

现在C'可以正确地合并到A中而无需进入B.

我的问题是,是否有任何自动化工具/脚本可以设置创建C'分支所需的挂起更改,因为手动执行此操作会花费我们很长时间?

Ric*_*erg 5

在TFS中重新分支一个分支很难.你可以通过baseless merge有效地给它一个额外的父,但是:

  • 如你所知,毫无根据的合并是繁琐且容易出错的
  • 没有用于删除与"真实"父级的合并关系的命令或API,缺少Destroy
  • 您将无法通过VS 2005/2008合并向导在新方向上执行合并

您似乎要求的 - 我同意是最好的解决方案 - 是一个名为C'的全新分支,恰好具有C与今天相同的内容.这是实现这一目标的快速方法:

  1. 使用普通的"分支"对话框创建新分支.如果它必须与C同名,那没关系,只需先将C重命名为C_old.您需要决定是否适合从最新版本或旧版本的A版本进行分支.(如果有帮助,您可以在"属性"对话框中看到B分支的版本.)
  2. 从磁盘中删除新的C目录.
  3. 将命令提示符导航到C_old目录,然后运行tfpt scorch -diff -deletes.这将确保C_old是最新的,并且不包含任何无关的文件(例如构建工件).
  4. 复制C_old - > C.
  5. 导航到C,然后运行tfpt online -adds -deletes -diffs.-r.这将根据需要添加,编辑和删除服务器以记录A [作为分支]和C [如磁盘上表示]之间的增量.
  6. 报到

此方法的唯一缺点是您不会在历史记录中看到更改3和4.当然,他们仍然会在C_old之下,但是像Annotate这样的工具不会知道 - 他们会在你创建C'的那一刻看到这些变化同时发生,而没有单独的评论/工作项/等等