我有三个回购 - 为清晰起见,名称已更改:
SharedStuff
,ProjectA
和ProjectB
这两个项目都使用git-subtree来维护SharedStuff
的本地副本。他们都进行了本地更改,我试图集中合并,测试,然后再次合并到每个。
我在ProjectA回购中运行了这个:
git subtree split --prefix=SharedStuff -b SharedStuff_from_ProjectA --rejoin
...然后将其推送到SharedStuff
回购,解决了一些简单的冲突,将其合并。
现在我在ProjectB回购中运行了这个:
git subtree split --prefix=platform/SharedStuff -b SharedStuff_from_Project_B --rejoin
...再次将其推送到新分支中的SharedStuff
仓库。当我尝试合并这些更改时会出现问题。
在目前的情况下,我切换到SharedStuff_from_Project_B
分支,然后git merge master
- 但我立即将所有已更改的文件列为添加/添加冲突。当我运行git mergetool
时,每个人都有这样的错误:
Merging:
somefile.xyz
Normal merge conflict for 'somefile.xyz':
{local}: created file
{remote}: created file
fatal: invalid path './somefile.xyz_BASE_20704.cs'
(当然,如果我尝试相反的方式 - 将SharedStuff_from_Project_B
合并到master
- 我会遇到相同类型的冲突,只是反过来。仍然添加/添加)。
我的猜测是ProjectB的历史可能有问题,导致添加/添加的外观。我不知道如何进一步诊断这一点 - 我该怎么办?
编辑:之前有一个子树"重新加入"在ProjectB
中提交,但似乎此处的更改未合并到SharedStuff
。但是,使用git subtree split
重新运行--ignore-joins
会产生同样的问题 - 许多add/add
合并冲突,尽管该分割子树分支的历史可以追溯到SharedStuff
时首先加入ProjectB
。 :(
修改:来自git merge-base
的拆分子树和ProjectB
上的master
之间的SharedStuff
也不会给出任何结果。我不确定这是怎么回事?如何解决?
答案 0 :(得分:1)
我不知道是什么造成的。但是,这是我如何解决它 - 有点。我还想要更好的答案!
两个'共享'分支SharedStuff
上的实际主分支和来自ProjectB
的分割副本在其远程历史中具有相同的提交 - 嗯,相同的更改具有相同的{{1} SHA内部,但不同的提交SHA。这是因为,不知何故,tree
分支的第一个初始提交与ProjectB
不同。
只要历史记录中没有共同提交(使用相同的SHA),合并,重新定位等就无法找到共同点,并且会假设两个历史记录中都添加了文件。
解决方案:在历史记录中找到两个早期提交,使用相同的SharedStuff
SHA(即完全相同的文件内容),并提交信息 - 消息,作者等 - 并手动“覆盖”该提交的父级在tree
的分支分支到ProjectB
的主人的父母。
我是用移植物做的:Setting git parent pointer to a different parent
SharedStuff
写一个新行,基本上是.git/info/grafts
wrong-parent right-parent
使用了16位字符格式,使用Sublime Text重新保存并再次切换;)echo
以达成交易下一个有趣的挑战是看看这个版本如何合并回git filter-branch right-parent..HEAD
;会在完成后更新..
我仍然真的很欢迎这个问题的真正答案 - 这真是太烂了!