gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:36:08 35 4
gpt4 key购买 nike

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

A  B
| /
BASE

我已经检查了 A,但是子模块还没有初始化。现在我 merge 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

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

最佳答案

让你的情况有点烦人的是 git 不会让你初始化一个未 merge 的子模块,所以通常的建议是将子模块设置为你在子模块中想要的状态然后运行 ​​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

关于git - 如果子模块未初始化,如何解决 git 子模块冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26617838/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com