我们的回购邮件是从SVN移植的。由于SVN上的一些非标准操作,git-svn
生成了不同的线程,如下所示
C0 <- C1 <- C2 ...
C1' <- C2' ...
C0和C1&#39;是所有&#34;初始提交&#34;,这意味着所有更改都是&#34;添加文件&#34;。
现在我要做的是,加入C1&#39;到C0以确保它们共享相同的根
C0 <- C1 <- C2 ...
|<- C1'' <- C2' ...
C1'
这里有C1&#39;&#39;是一个提交,它是C0和C1&#39;的合并,但最终状态相当于C1&#39;。那么后来的链节点可以保持不变。
git
命令的组合是否可以执行此操作?
答案 0 :(得分:2)
请参阅git replace的帮助页面并尝试以下命令
git replace --graft C1&#39; C0
对于早于2.1的Git版本,请使用
NEW_SHA=$(echo "Replacement commit" | git commit-tree -p CO C1'^{tree} -F -)
git replace C1' $NEW_SHA
答案 1 :(得分:1)
字面上的答案是否定的:问题是提交是其所有内容的校验和,包括其父ID,所以如果你有一个C2'
指向C1'
,并且您制作了新副本C1''
,您必须制作新副本C2''
以指向C1''
,依此类推。
也就是说,执行这项工作的明显命令是git filter-branch
:您可以使用提交过滤器将C1'
复制到以C0
作为父项的新提交,然后让更改波动整个提交图的其余部分。但是,如果您要这样做,重做导入可能更有意义。 (我不是SVN进口的专家。我之前做了一些CVS-to-git导入,我做了一些测试导入,然后用更好的选项重新编写它们等等。它非常慢,但是这只是计算机时间,而我做了其他事情。)