如果未初始化子模块,如何解决git子模块冲突

MrT*_*Tux 15 git git-submodules

我有两个分支AB.两者都包含一个子模块(在文件夹中sub),但是在不同的提交中(不会从一个快进到另一个).

A  B
| /
BASE
Run Code Online (Sandbox Code Playgroud)

我已经检查过A,但子模块尚未初始化.现在我合并B,我在子模块上发生冲突.

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

        both modified:   sub
Run Code Online (Sandbox Code Playgroud)

发布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
Run Code Online (Sandbox Code Playgroud)

git submodule init -- sub什么也没做.也git submodule update --init --force -- sub行不通:Skipping unmerged submodule sub.

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

use*_*445 21

什么使你的情况有点烦人是git不会让你初始化一个未合并的子模块,所以只是将子模块设置为子模块然后运行所需的状态的普通建议git add将不起作用.您可以做的是直接更新索引,而无需通过工作树.

更新索引的一种方法是使用git reset.如果您知道子模块处于所需状态的提交,则可以使用该提交.例如,以下任何一个可能是您想要的:

git reset master -- sub
git reset master@{upstream} -- sub
git reset HEAD -- sub
git reset MERGE_HEAD -- sub
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用plumbing命令直接更新索引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
Run Code Online (Sandbox Code Playgroud)