将Git仓库历史更改为线性

7
我们需要从Git源代码库生成一个TFS存储库,我们希望保留原始提交历史记录,因此我尝试使用Tf-Git "git tf checkin --deep"命令,该命令应该为每个Git提交创建一个TFS更改集。
不幸的是,这一步骤失败了,因为Git存储库中有很多提交由于合并而具有两个父级,而TFS要求提交历史记录是线性的才能导入它。因此,我收到以下错误:
git-tf: cannot check in - commit 2b15822 has multiple parents, please rebase to form a linear history or use --shallow or --autosquash

这很容易理解。但如果现有的Git存储库存在长链式提交,那么该怎么办?我知道可以花一两天时间手动修订提交历史记录,但这不是我们想要花费时间的方式。我是否正确地理解了没有自动修复提交历史记录以形成线性的方式,因此除非我们想要花费许多时间进行手动工作,否则我们应该将整个历史记录作为单个更改集导入?

1个回答

12

重新设置基准分支实际上可以为您解决这个问题。

git rebase -i <hash of commit before first branch has been created>
在执行该命令时弹出的窗口中,不要更改任何内容,只需保存并关闭即可。
一个示例:
A <- B <- E <-----F <- G      master
     ^            ^
      \          /
       - C <- D -             branch

提交 CD 在一个分支上,并已合并到主分支,合并提交为 F

现在,从 master 执行 git rebase -i B 将产生以下结果:

A <- B <- C <- D <- E <- G    master
请注意,合并提交F已经消失,因为它将为空。

让我确认一下,Daniel。我运行了“git rebase -i <提交的哈希值>”,现在弹出了一个窗口让我保存变基。但这只是变基了几个提交,而不是整个历史记录。我应该遍历整个树形结构,并针对所有分支节点重复此操作吗? - Vagif Abilov
我不知道你的历史有多复杂,但如果你选择第一个分支之前的提交,你应该得到一个线性的历史记录。顺便说一下:窗口不是用来保存变基的 - 在那个窗口中,你实际上可以通过改变它们的顺序等来更改提交。但这不是我们想在这里做的事情。 - Daniel Hilgarth
请注意:在我的评论中,我强调了“第一个分支之前”。我已相应地更改了我的答案。在创建第一个分支之前的最后一次提交是要使用的正确提交。 - Daniel Hilgarth
谢谢Daniel,我明白了。我已经开始从第一个分支之前的提交进行变基,它触发了大约1700个项目的变基。看起来工作流程是正确的,不幸的是我现在遇到了一个错误“error: addinfo_cache failed for path '<some path>'”,但这似乎是另一个问题。 - Vagif Abilov
1
是的,花了一些时间,但现在进展顺利。addinfo_cache 很容易解决,就像合并冲突一样,消息有点误导人。再次感谢您的帮助。 - Vagif Abilov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接