【问题标题】:Revising git repo history to become linear将 git repo 历史修改为线性
【发布时间】:2013-01-20 04:28:59
【问题描述】:

我们需要从 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 存储库有很长的此类提交链,可以做些什么呢?我知道可以花一两天时间手动修改提交历史记录,但这不是我们想要花费的时间。我是否正确理解没有自动化的方法可以将提交历史记录变为线性,所以除非我们想花很多时间在手动工作上,否则我们应该将整个历史记录作为单个变更集导入?

【问题讨论】:

    标签: git tfs git-tf


    【解决方案1】:

    变基实际上应该为您解决这个问题。

    git rebase -i <hash of commit before first branch has been created>
    

    在执行该命令时弹出的窗口中,不要更改任何内容。只需保存并关闭。

    插图:

    A <- B <- E <-----F <- G      master
         ^            ^
          \          /
           - C <- D -             branch
    

    提交 CD 位于分支上,并已通过合并提交 F 合并到 master。

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

    A <- B <- C <- D <- E <- G    master
    

    请注意,合并提交 F 消失了,因为它将是空的。

    【讨论】:

    • 让我看看我是否理解你,丹尼尔。我运行了“git rebase -i ”。我得到一个可以保存变基的窗口。但这只会改变一些提交,而不是整个历史。我应该遍历整个树并为所有分支节点重复它吗?
    • 我不知道你的历史有多复杂,但是如果你选择提交在第一个分支之前,你应该得到一个线性的历史。顺便说一句:该窗口不是用于保存变基 - 在该窗口中,您实际上可以通过更改提交顺序等来更改提交。但这不是我们想要在这里做的。
    • @VagifAbilov:请注意:我在评论中强调了“在第一个分支之前”。我相应地改变了我的答案。创建第一个分支之前的最后一次提交是正确的。
    • 谢谢丹尼尔,这是有道理的。我已经开始从第一个分支之前的提交中变基,它触发了 ca 的变基。 1700 项。看起来工作流程是正确的,不幸的是我现在收到一个错误“错误:addinfo_cache failed for path ''”,但这似乎是另一个问题。
    • 是的,这需要时间,但现在进展顺利。 addinfo_cache 很容易解决,就像合并冲突一样,该消息具有误导性。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2021-06-19
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多