Git 子模块显示新提交,子模块状态未显示任何要提交的内容

Git 子模块显示新提交,子模块状态未显示任何要提交的内容

在 git 存储库中,我设置了 .gitmodules 文件来引用 github 存储库:

[submodule "src/repo"]
    path = src/repo
    url = repourl

当我在此存储库上“git status”时,它显示:

On branch master
Your branch is up-to-date with 'origin/master'.

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)

modified:   src/repo (new commits)

如果我 cd 进入 src/repo 并在 repo 上查看 git status,它会说没有什么可提交的。

为什么我的顶级 git 存储库会抱怨?

答案1

我刚刚遇到了同样的问题,并且我能够使用提供的解决方案@奥古斯汀阿梅纳巴尔在已接受答案的评论部分。我的设置有点复杂,因此我添加了标志--recursive以使所有依赖项保持最新。

git submodule update --recursive src/repo

答案2

这是因为 Git 记录了应该为每个子模块签出哪些提交(不是分支或标签,而是 SHA-1 哈希表示的一次提交)。如果您更改了子模块目录中的某些内容,Git 将检测到它并敦促您在顶级存储库中提交这些更改。

git diff在顶级存储库中运行以显示实际更改了 Git 的想法。如果您已经在子模块中进行了一些提交(因此在子模块中“干净”),它会报告子模块的哈希更改。

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

否则,它会显示-dirty您无法在顶级存储库中暂存或提交的哈希更改。 git status还声称子模块具有未跟踪/修改的内容。

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ git status
On branch master
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:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

要更新子模块应检出哪些提交记录,除了提交子模块中的更改之外,您还需要 git commit 子模块:

git add src/repo

答案3

这里的答案都不能解决我的问题。

我在这里记录/分享对我有用的东西。希望它能帮助别人。

最初我的子模块位于提交 A(在将子模块添加到主存储库时),然后我签出一个分支(让我们称之为new-submodule-branch)并向其提交 B 和 C 并将其推送到远程(github.com)

发布此内容后,我的主要存储库开始显示

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   <submodule_name> (new commits)

如果我从主存储库根运行,git submodule update --remote --init --recursive它会不断将子模块的 HEAD 恢复为分离状态以提交 A

然后我将分支值设置new-submodule-branch如下<MainRepo>/.gitmodules

[submodule "<submodule_name>"]
    path = <submodule_name>
    url = [email protected]:ProProgrammer/<submodule_name>.git
    branch = new-submodule-branch

发布此内容,当我运行时git submodule update --remote --init --recursive,它不会再将我的子模块的 HEAD 恢复为分离状态以提交 A,但它仍然继续显示令人讨厌的内容

    modified:   <submodule_name> (new commits)

到目前为止,我一直在关注官方子模块的 git 参考,现在我决定再做一些谷歌搜索,我偶然发现了一篇文章标题为让 git 子模块跟踪分支,这清楚地表明了

您必须去更新该子模块提交引用到远程分支中的最新代码以避免这种情况

所以最后,我做了我试图避免的事情:

git add <submodule_name>
git commit --amend --no-edit # I combined this with the previous commit where I added the 'branch' value in .gitmodules

如果你想看看推送到远程(在我的例子中是 github.com)后的样子,你可以看到这个确切的提交这里

相关内容