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

问题描述 投票:0回答:1

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

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

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

git git-submodules
1个回答
0
投票

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

一个Git存储库通常从不知道其他Git存储库中的提交。有人可能会认为超级项目中的链接可以使超级项目Git更加了解……有时,可能会,但是在您的情况下却不是。 (我们不确切知道您的案子是什么,但是显然,无论您的案子是什么,它都不是超级项目立即引起注意的罕见情况之一。)如果一个Git存储库-子模块称为

S

-是其他一些Git存储库的clone(对于子模块的来源称为OS),那么您可以输入存储库S并运行git fetch origin。这会将所有来自OS的新提交带入SS中没有新的提交得到检出,因为git fetch除了存储库中的远程跟踪名称外,从不更改任何内容。它仅接收新的提交(然后适当地更新Sorgin/master,依此类推)。如果现在在存储库

S

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

R

-使用其他存储库S作为子模块时,R中的各种操作将进入子模块S并运行[C0 ],以便在一个特定提交上将S置于分离的HEAD状态。此处使用的哈希ID记录在R
中的提交中。如果您自己输入

S

git checkout hash一些other哈希ID,然后返回R并询问其(R's)的状态,Git处理R将注意到S不再是R请求的提交。因此可以说S中发生了一些事情。现在,您可以运行git checkout更新R索引中的哈希ID,以便它记录您在S中选择的提交的哈希ID。此时,在R中进行新的提交会将新的哈希ID记录为正确的哈希ID。
签出

R

中的任何特定提交,将使用该提交中的子模块哈希ID填充R的Git索引。除非您指定递归检出,否则这不会影响在[[S
中作为分离头检出的哈希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读取。

© www.soinside.com 2019 - 2024. All rights reserved.