Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果子模块未初始化,如何解决git子模块冲突_Git_Git Submodules - Fatal编程技术网

如果子模块未初始化,如何解决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