【问题标题】:Reparenting a branch in TFS2008在 TFS2008 中重新设置一个分支
【发布时间】:2010-12-06 23:08:10
【问题描述】:

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

A ------------------------------
     |
B    ----1--2------------------
                 |
C                ----3-----4---

现在假设我们想从 C 合并到 A,但绕过 B。TFS 不允许这样做 - 我必须进行无根据的合并,这很容易出错。真的,我想让 C “重新成为父母”(如果这是正确的术语),所以它是 A 的孩子,而不是 B。换句话说,我希望得到以下分支结构。 (C' 可以是原来的 C 分支,也可以是 C 应有的新分支)。

A ------------------------------
     |   |
B    |   ----1--2------------------
     |           
C'   |-------1--2----3-----4---

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

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

【问题讨论】:

  • 为什么你认为毫无根据的合并容易出错?
  • 无根据的合并导致数百个合并“冲突”,包括仅在两个分支之一上更改的文件。这是因为它不知道它正在合并的分支之间的关系。它也无法处理已删除的代码 - 合并会将其放回原处。

标签: tfs merge branch


【解决方案1】:

在 TFS 中重新创建一个分支很难。您可以通过毫无根据的合并有效地为其添加一个父级,但是:

  • 如您所知,无根据的合并既乏味又容易出错
  • 没有用于删除与“真实”父级的合并关系的命令或 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' 的日期看到这些更改同时发生,而没有单独的 cmets/工作项/等等

【讨论】:

  • 很好的答案,谢谢。这次我们只是在努力解决毫无根据的合并冲突,但是 tfpt 在线命令看起来对将来非常有用。
  • 明确地说,似乎每次您想合并到新流时都需要使用此技术。
猜你喜欢
  • 2022-11-09
  • 2014-05-11
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多