如果子模块未初始化,如何解决Git子模块冲突问题

23

我有两个分支AB。它们都包含一个子模块(在文件夹sub中),但是它们位于不同的提交上(这些提交不能从一个提交快速前进到另一个提交)。

A  B
| /
BASE

我已经检查了A,但子模块尚未初始化。现在我合并B,子模块出现冲突。

$ git status
Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   sub

git checkout --ours sub 命令没有任何作用(如果子模块已初始化,则正常工作,也不会使用 git checkout-index -f --stage=2 -- sub)。 执行 git add sub 会提示错误信息 error: pathspec 'sub' did not match any file(s) known to git..

$ git diff sub
diff --cc sub
index 533da4e,ab2af77..0000000
--- a/sub
+++ b/sub
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 533da4ea00703f4ad6d5518e1ce81d20261c40c0
 -Subproject commit ab2af775ec467ebb328a7374653f247920f258f3
++Subproject commit 0000000000000000000000000000000000000000

git submodule init -- sub命令没有任何作用。同时,git submodule update --init --force -- sub也无法正常工作:Skipping unmerged submodule sub

那么,我该如何解决这个子模块的冲突(而不是中止合并并在初始化子模块后重试)?

2个回答

33
你的情况比较烦人的是,Git无法初始化未合并的子模块,因此普通的建议就是在子模块内设置所需状态,然后运行“git add”,这种方法行不通。 你可以直接更新索引,而不必通过工作树。
使用“git reset”是一种更新索引的方法。如果你知道子模块处于所需状态的提交,那么可以使用该提交。例如,以下任何一个可能是你想要的:
git reset master -- sub
git reset master@{upstream} -- sub
git reset HEAD -- sub
git reset MERGE_HEAD -- sub
另一种选择是使用管道命令git update-index直接更新索引。要这样做,您需要知道指向子模块的父存储库中的目录条目的gitlink类型对象为0160000。无法从第一原则上弄清楚这一点,但可以从git ls-files -s或以下参考资料中找到(在4位对象类型下看到“1110(gitlink)”):https://github.com/gitster/git/blob/master/Documentation/technical/index-format.txt 要使用该方法,请确定要设置子模块的哈希值,然后运行,例如:
git update-index --cacheinfo 0160000,533da4ea00703f4ad6d5518e1ce81d20261c40c0,sub

0

这就像普通的合并一样:您必须提供正确的路径内容,以便Git可以提交它。子模块内容存储为其当前提交ID,因此当它具有正确的内容时(这意味着其HEAD引用正确的提交),您必须将子模块的路径添加到项目中(就像添加任何文件的路径一样)。通常,您可以通过普通的checkout获得。

在您的情况下,您不能同时拥有子模块路径处的正确合并结果内容和没有任何内容。唯一必要的是在该路径上拥有一个具有正确提交ID的仓库。包含仓库实际上并不关心子模块仓库来自何处,此时唯一重要的是HEAD中的提交ID。


4
这个操作"就像普通的合并一样工作",但是git checkout --oursgit add不起作用。如何“在该路径上提供正确的内容”?——“唯一必要的是在该路径下有一个正确提交 ID 的 repo 在 HEAD 中”——但是如何实现呢?因为初始化子模块不起作用。 - MrTux
子模块就是一个仓库。“唯一必要的是在该路径下拥有一个仓库”。git clone u://r/l -b $yourbranch path/to/repo; git add path/to/repo; git commit -m done. - jthill
这个选项对我有用。我只是在子模块位置克隆了缺失仓库的正确版本,然后合并成功了。 - Joe Steele

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