gpt4 book ai didi

Git-tf checkin 失败 : commit [commitid] has multiple parents. 使用 --deep 选项在 TFS 中创建历史记录

转载 作者:太空狗 更新时间:2023-10-29 13:28:15 24 4
gpt4 key购买 nike

似乎 --deep--shallow 似乎都不起作用。尝试对 TFS 中的新文件夹(当前为空)执行 git-tf checkin --deep 时出现错误。我有一个有相当多历史的 git repo。作为 git-tf 的一部分,我很乐意保留/迁移到 TFS。

我的理解是 checkin --deep 会在 TFS 中为每次提交创建一个类似的变更集。问题是 git repo 中任何似乎是 merge 结果的提交(我们在这个 repo 中有很多 merge )似乎使 git-tf 命令非常不高兴并报告我在标题中提到的错误消息([commitid] 除外被替换为真实的提交 ID(例如 9a26d8))。

我不确定我是否完全错过了这里的船还是什么。是否有可靠的方法将历史上具有多个 merge 提交的预先存在的 git repo 移植到 TFS?我希望这是一个原始功能/修复。我希望我遗漏了一些东西。我对 TFS 非常熟悉,但对 git 不熟悉,因此非常感谢您的帮助。

最佳答案

这里的问题是在 TFS 中表示复杂的 merge 历史很困难。很简单,git 提交可以有多个父项,而 TFS 变更集只能有一个。

考虑我的 git 存储库在某个提交时有 HEAD 的状态,比方说 9c42ef...。现在我进行更改并提交,创建一个新的提交 1f23cd...。同时,我还从 Bob 那里进行了更改,这也是基于 9c42ef... 的提交。他的更改是提交 ID f41ac3...。如果我想 merge 这两个更改,我必须进行 merge ,假设我最终得到提交 ID 7acdfe...。现在你的图表看起来像这样:

          1f23cd
/ \
9c42ef 7acdfe (HEAD)
\ /
f41ac3

这在 TFS 中不容易表示,因为单个变更集只能有一个祖先(直接在它之前的变更集)。因此我们需要线性化历史记录。这就是 --squash--auto-squash 选项存在于 git-tf checkin 上的原因(进行深度 checkin 时)。

--squash 选项允许您选择在处理历史记录时要遵循的路径。例如:

git-tf checkin --deep --squash f41ac3

在遍历图表时将省略 f41ac3,您将拥有三个变更集,9c42ef1f23cd7acdfe。但是在一个大图中,指定每个提交到 squash 需要做很多工作。在这种情况下,--auto-squash 将使用一些魔法来确定要遵循的路径。 (它更喜欢具有最长提交链的路径,以便您获得尽可能多的历史记录,如果两个段的长度相等,将使用时间戳来确定要遵循的路径。)

git-tf checkin --deep --auto-squash

您还可以 rebase ,以便您 checkin 的提交是线性的,并且每个提交只有一个父级。

git-tf 开发人员根据树的复杂性、键入无穷无尽的 SHA1 哈希字符串和月相的自虐感受来使用这些策略中的每一个。

关于Git-tf checkin 失败 : commit [commitid] has multiple parents. 使用 --deep 选项在 TFS 中创建历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12065640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com