合并子树更改 - 致命:无效路径&some; somefile_BASE_20704.cs'

时间:2016-05-17 08:25:02

标签: git git-merge git-subtree

我有三个回购 - 为清晰起见,名称已更改:

SharedStuffProjectAProjectB

这两个项目都使用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也不会给出任何结果。我不确定这是怎么回事?如何解决?

1 个答案:

答案 0 :(得分:1)

我不知道是什么造成的。但是,这是我如何解决它 - 有点。我还想要更好的答案!

两个'共享'分支SharedStuff上的实际主分支和来自ProjectB的分割副本在其远程历史中具有相同的提交 - 嗯,相同的更改具有相同的{{1} SHA内部,但不同的提交SHA。这是因为,不知何故,tree分支的第一个初始提交与ProjectB不同。

只要历史记录中没有共同提交(使用相同的SHA),合并,重新定位等就无法找到共同点,并且会假设两个历史记录中都添加了文件。

解决方案:在历史记录中找到两个早期提交,使用相同的SharedStuff SHA(即完全相同的文件内容),并提交信息 - 消息,作者等 - 并手动“覆盖”该提交的父级在tree的分支分支到ProjectB的主人的父母。

我是用移植物做的:Setting git parent pointer to a different parent

  1. SharedStuff写一个新行,基本上是.git/info/grafts
  2. 切换到分支 - 发现PowerShell wrong-parent right-parent使用了16位字符格式,使用Sublime Text重新保存并再次切换;)
  3. 在分支机构上运行echo以达成交易
  4. 验证所有内容是否合并
  5. 下一个有趣的挑战是看看这个版本如何合并回git filter-branch right-parent..HEAD;会在完成后更新..

    我仍然真的很欢迎这个问题的真正答案 - 这真是太烂了!