合并子目录更改 - 致命错误:无效路径“somefile_BASE_20704.cs”

20

我有三个仓库 - 为了更清晰,名称已更改:

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 - 但是我立即看到所有已更改的文件都列为 add/add 冲突。在运行 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'

(当然,如果我尝试反过来-将 Project_B 中的 SharedStuff_from_Project_B 合并到 master 中-我会遇到相同类型的冲突,只不过是相反的。仍然是add / add)。

我猜测在ProjectB的历史记录中可能有问题,导致出现add / adds的情况。 我不确定如何进一步诊断这个问题 - 我该怎么办?

编辑:在 ProjectB 中先前有一个子树“重新加入”提交,但似乎那时更改没有合并到 SharedStuff 中。 但是,使用 --ignore-joins 重新运行 git subtree split 会产生相同的问题-尽管该分离子树分支的历史记录可以追溯到将 SharedStuff 首次放入 ProjectB 的时候。 :(

编辑:此外,在 ProjectB 的分离子树与 SharedStuff 上的 master 之间进行 git merge-base 也没有给出任何结果。 我不确定这是如何发生的或如何解决?


我们开始吧,赏金任务 #3 ... - Kieren Johnstone
1个回答

1
我不知道是什么原因导致了这个问题。但是,以下是我解决它的方法 - 不过还需要更好的答案!在SharedStuff上,“共享”的两个分支和从ProjectB拆分出来的副本都有相同的提交历史记录 - 内部具有相同的更改和相同的tree SHA,但具有不同的提交SHA。这是因为,一些原因,ProjectB分支的第一个初始提交与SharedStuff不同。只要历史记录中没有共同的提交(具有相同的SHA),合并、变基等操作就无法找到共同点,并且会假定文件在两个历史中都添加了。解决方案:在历史记录中找到两个早期提交,具有相同的tree SHA(即完全相同的文件内容)和提交信息 - 消息、作者等,并手动“覆盖”ProjectB拆分分支中该提交的父提交为SharedStuff主分支的父提交。
我使用嫁接实现了这个功能: 将git父指针设置为不同的父节点
  1. .git/info/grafts中写入一行新内容,格式为wrong-parent right-parent
  2. 切换到分支-发现PowerShell echo使用了16位字符格式,用Sublime Text重新保存并再次切换 ;)
  3. 在该分支上运行git filter-branch right-parent..HEAD以完成操作
  4. 验证所有内容是否可以合并

下一个有趣的挑战是看看这个版本如何合并回ProjectB;完成后会进行更新。

我仍然非常希望得到一个真正的答案 - 这真的很hacky!


快速更正:嫁接线实际上应该是 child-of-wrong-parent right-parent。但我仍然不想采取这种做法。 - Kieren Johnstone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接