为什么git看不到子模块中的新提交?

时间:2019-11-06 08:58:08

标签: git git-submodules

我已经在子模块中进行了一次新的提交,但是git并不表示该子模块在存储库的根级别上已更改(新的提交)。

git status表示一切都是最新的,并不表示子模块已更改(例如,新提交)。

git commit --allow-empty也没有帮助。

1 个答案:

答案 0 :(得分:0)

一个子模块不过是另一个Git存储库,还有一些链接存储在超级项目中。

一个Git存储库通常从不知道其他一些Git存储库中的提交。有人可能会认为,超级项目中的链接可以使超级项目Git更加了解……有时,可以,但在您的情况下则不然。 (我们不确切知道您的案子是什么,但是显然,不管您的案子是什么,超级项目都不会立即注意到这些罕见的情况。?)

如果一个Git储存库(子模块称为 S )是其他某些Git储存库的克隆(对于以下情况,则称为 OS 子模块的来源),然后您可以输入存储库 S 并运行git fetch origin。这会将所有来自 OS 的新提交提交到 S 。在 S 中,没有新的提交被检出,因为git fetch除了存储库中的远程跟踪名称外,从不更改任何内容。它只会接收新的提交(然后更新 S orgin/master等,以此类推)。

如果您现在在存储库 S 中运行git checkout hash-idgit checkout non-branch-name,则您指定的提交将在 S 中作为独立对象检出头。如果运行git checkout branch-name,则您指定的提交将作为附加的HEAD检出: S 现在位于分支上。所有这些的重要部分不是HEAD是连接还是分离。是您签出了一些特定的 commit 1

当某个Git存储库(我们称为 R )使用其他存储库 S 作为子模块时,将输入 R 中的各种操作子模块 S 并运行git checkout hash,以在一次特定提交时将 S 置于分离的HEAD状态。此处使用的哈希ID记录在 R 中的提交中。

如果您自己输入 S git checkout一些 other 哈希ID,然后返回 R 并询问其(<的状态,则Git处理 R 会注意到 S 不再属于 R 请求的提交。因此会说 S 中发生了一些事情。现在,您可以运行git add path/to/S更新 R 索引中的哈希ID,以便它记录您在 S 中选择的提交的哈希ID。此时,在 R 中进行新的提交会将新的哈希ID记录为正确的哈希ID。

检出 R 中的任何特定提交,将使用该提交中的子模块哈希ID填充 R 的Git索引。除非您指定递归检出,否则这不会影响作为 S 中的分离头检出的哈希ID。您必须运行git submodule update,使 R 输入 S 并发出相应的git checkout hash命令。

如果您想手动控制 S ,这是正确的处理方式:您不希望 R 中检出内容> S ,并弄乱了您的手动控制。如果您想要手动控制-如果您希望 R 始终控制 S -请在< strong> R 。


1 尽管 R 通常使用独立头,但超级项目 R 不在乎是否连接了 S 的HEAD。 R 将会记录原始的提交哈希ID,无论如何。因此,它只是从 S 中读取哈希ID,而不是从中读取branch-name-or-lack-