我已经在子模块中进行了新的提交,但是git并未指示在存储库的根级别上子模块已更改(新的提交)。
[git status
表示一切都是最新的,并不表示子模块有更改(例如,新提交)。
git commit --allow-empty
也没有帮助。
一个子模块不过是另一个Git存储库,以及一些存储在超级项目中的链接。
一个Git存储库通常从不知道其他Git存储库中的提交。有人可能会认为超级项目中的链接可以使超级项目Git更加了解……有时,可能会,但是在您的情况下却不是。 (我们不确切知道您的案子是什么,但是显然,无论您的案子是什么,它都不是超级项目立即引起注意的罕见情况之一。)如果一个Git存储库-子模块称为 S S R S Rgit fetch origin
。这会将所有来自OS的新提交带入S。 S中没有新的提交得到检出,因为git fetch
除了存储库中的远程跟踪名称外,从不更改任何内容。它仅接收新的提交(然后适当地更新S的orgin/master
,依此类推)。如果现在在存储库git checkout hash-id
或git checkout non-branch-name
,则指定的提交将在S中作为独立的HEAD检出。如果运行git checkout branch-name
,则指定的提交将作为附加的HEAD检出:S现在在分支上。所有这些的重要部分不是HEAD是连接还是分离。是您签出了一些特定的commit。1当某些Git存储库-称为git checkout hash
一些other哈希ID,然后返回R并询问其(R's)的状态,Git处理R将注意到S不再是R请求的提交。因此可以说S中发生了一些事情。现在,您可以运行git checkout
更新R索引中的哈希ID,以便它记录您在S中选择的提交的哈希ID。此时,在R中进行新的提交会将新的哈希ID记录为正确的哈希ID。签出git add path/to/S
以使R输入S并发出适当的git submodule update
命令。如果您想对S
R在S中检查内容并弄乱您的手动。如果您不需要想要手动控制-如果您希望R始终控制S-请在R中使用git checkout hash
检出模式。
1
R通常使用分离的头,但是超级项目R 不在乎是否已连接S的HEAD。 R将会记录原始的提交哈希ID,无论如何。因此,它仅从S读取哈希ID,而不从branch-name-or-lack-thereof读取。