当您没有积极使用git子模块时使用git子模块

时间:2017-09-20 22:57:33

标签: git git-merge git-submodules

我们最近在我们的git存储库中添加了一个子模块。有一个人负责处理子模块,因此大多数开发人员通常 不得不关心子模块版本,更改和更新。

事实证明,在某些情况下,无法忽略子模块存在的事实(与常规目录相对)。不幸的是,关于git子模块的大多数文档都集中在如何主动更改子模块的内容,而不是如何有效地避免对子模块内容进行主动更改。

我目前面临的最大问题是合并。我有我的分支,我不应该对子模块进行任何更改。然后我合并到另一个分支, 对子模块进行了更改。这导致git status

中的以下内容
# All conflicts fixed but you are still merging.
#   (use "git commit" to conclude merge)
#
...
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   path/to/submodule (new commits)

果然,如果我做git diff,它会显示更改:

diff --git a/path/to/submodule b/path/to/submodule
index 0dce5c0..a4df5ed 160000
--- a/path/to/submodule
+++ b/path/to/submodule
@@ -1 +1 @@
-Subproject commit 0dce5c08ea0c1ff9208cc9427aef5872c75f1e1e
+Subproject commit a4df5ed659cf150200a14529e1fc34727213792c

鉴于不应该对我的合并的HEAD分支端的子模块进行任何更改,并且我绝对希望我的最终合并提交包含另一个分支上的子模块的版本,我该解决这个问题吗?

在相关的说明中,如果我确实设法弄乱了关于子模块的这个合并,我该如何修复它?也就是说,&#34;使子模块与给定分支上的状态匹配&#34;命令?对于普通文件,您可以使用git checkout <branchname> -- path/to/file,但git checkout <branchname> -- path/to/submodule似乎无法正常工作,尽管git状态打印的标题表明它可能。

1 个答案:

答案 0 :(得分:0)

如o11c所述,即使你没有积极使用子模块,你也必须执行:

git submodule update

:当吗

当使用子模块的开发人员在子模块中创建新提交并更新当前分支以使用这些新提交时。然后对子模块的引用已更改,您需要执行git submodule update以请求git将这些更改传播到您的工作副本(文件系统)。

它做了什么?

git submodule update在父git存储库中检查当前分支引用的提交中的子模块,以便子模块中的代码与父存储库中的代码同步。