Git-tf签入失败:commit [commitid]有多个父项.使用--deep选项在TFS中创建历史记录

EdF*_*red 4 git tfs branching-and-merging tfs2012 git-tf

似乎既没有--deep--shallow没有效果.尝试git-tf checkin --deep在TFS中对新文件夹(当前为空)执行错误时收到错误.我有一个git repo,有很多历史.作为git-tf的一部分,我很乐意保留/迁移到TFS.

我的理解是,checkin --deep每次提交都会在TFS中创建一个类似的变更集.问题是,git repo中的任何提交似乎都是合并的结果(我们在这个repo中有很多合并)似乎使git-tf命令非常不满意并报告我在标题中提到的错误消息(使用[commitid]的异常被替换为实际的提交id(例如9a26d8)).

我不确定我是否完全错过了这里的船或什么.是否有可靠的方法将历史上多次合并提交的预先存在的git repo移植到TFS?我希望这是一个原始的功能/修复.我希望我错过了什么.我对TFS非常不满意,但不像git那样经验丰富,所以对任何帮助表示赞赏.

Edw*_*son 16

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

考虑一下我的git存储库在某次提交时有HEAD的状态,比如说9c42ef....现在我进行更改并提交它,创建一个新的提交1f23cd....同时,我也从Bob那里做了一个改变,这也是一个基于的提交9c42ef....他的更改是提交ID f41ac3....如果我想要包含两个更改,我将不得不进行合并,并且假设我最终得到了提交ID 7acdfe....现在你的图表看起来像这样:

          1f23cd
        /        \
9c42ef             7acdfe (HEAD)
        \        /
          f41ac3
Run Code Online (Sandbox Code Playgroud)

这不能在TFS中轻松表示,因为单个变更集只能有一个祖先(变更集直接在它之前).所以我们需要线性化历史记录.这就是为什么存在--squash--auto-squash选项git-tf checkin(进行深入检查时).

--squash选项允许您选择在历史记录中使用哪条路径.例如:

git-tf checkin --deep --squash f41ac3
Run Code Online (Sandbox Code Playgroud)

将省略f41ac3走在曲线图时,你将有三个变更,内容9c42ef,1f23cd7acdfe.但是在一个大图中,指定每个提交壁垒需要做很多工作.在这种情况下,--auto-squash将使用一些魔法来确定要遵循的路径.(它更喜欢具有最长提交链的路径,以便您获得尽可能多的历史记录,如果两个段具有相同的长度,将使用时间戳来确定要遵循的路径.)

git-tf checkin --deep --auto-squash
Run Code Online (Sandbox Code Playgroud)

您还可以重新设置,以便您检入的提交是线性的,每个提交只有一个父级.

git-tf开发者使用的每个取决于树的复杂性,这些策略的,关于输入法SHA1哈希无尽的字符串和月亮的相位自虐的感觉.