如果子模块未初始化,如何解决git子模块冲突
我有两个分支如果子模块未初始化,如何解决git子模块冲突,git,git-submodules,Git,Git Submodules,我有两个分支A和B。两者都包含一个子模块(在文件夹sub中),但提交方式不同(不会从一个模块快进到另一个模块) 我已签出A,但子模块尚未初始化。现在我合并B,子模块上出现冲突 $ git status Unmerged paths: (use "git add <file>..." to mark resolution) both modified: sub git子模块init--sub不执行任何操作。另外,git子模块更新--init--force--
A
和B
。两者都包含一个子模块(在文件夹sub
中),但提交方式不同(不会从一个模块快进到另一个模块)
我已签出A
,但子模块尚未初始化。现在我合并B
,子模块上出现冲突
$ git status
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: sub
git子模块init--sub
不执行任何操作。另外,git子模块更新--init--force--sub
不起作用:跳过未合并的子模块sub
那么,我如何解决这个子模块冲突(不中止合并并在初始化子模块后重试)?这就像普通的合并一样:您必须在该路径上提供正确的内容,以便git可以提交它。子模块内容存储为其当前提交id,因此当子模块具有正确的内容时,您必须将其路径添加到项目中(就像添加任何文件的路径一样),这意味着其
头引用了正确的提交。通常你是通过普通的结账方式得到的
在您的情况下,不能在子模块路径上既有正确合并结果的内容,又完全没有内容。唯一需要做的是在该路径上有一个repo,并在HEAD
中具有正确的提交id。包含的repo实际上根本不关心该路径的子模块repo来自何处,此时唯一重要的是头中的commit id
让您感到恼火的是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)”)中找到答案:
要使用该方法,请找出要将子模块设置为的哈希值,然后运行,例如:
git update-index --cacheinfo 0160000,533da4ea00703f4ad6d5518e1ce81d20261c40c0,sub
“这就像一个普通的合并”,然而git签出——我们的和git add
不起作用。如何“在该路径上提供正确的内容”?-“唯一需要做的是在该路径上有一个repo,头部有正确的提交id”-但是我如何才能实现这一点,因为初始化子模块不起作用?子模块只是一个repo。“唯一必要的是在这条道路上进行回购”git克隆u://r/l-b$yourbranch路径/to/repo;git添加路径/to/repo;git commit-m done
。这个选项对我有效。我只是在子模块位置克隆了丢失的repo的正确版本,然后合并成功了。
git reset master -- sub
git reset master@{upstream} -- sub
git reset HEAD -- sub
git reset MERGE_HEAD -- sub
git update-index --cacheinfo 0160000,533da4ea00703f4ad6d5518e1ce81d20261c40c0,sub