带有子模块的 git status 显示“新提交”

带有子模块的 git status 显示“新提交”

如果我有一个包含子模块的项目,在子模块中进行更改,然后提交这些更改,则主项目将在该子模块上显示“新提交”。

但是,如果我“git pull”并更新我的本地项目,并且在拉取中子模块提交发生更改,“git status”也会显示“新提交”。

我很困惑“新提交”可能意味着“您需要提交本地更改”,或者“您已使用需要更新的新引用进行了更新”。

似乎“新提交”可以告诉你两件完全相反的事情。

有没有更好的方法可以从顶层了解您是否有需要推送的更改,以及您是否有需要更新的新参考?

答案1

我想你看到的是这样的:

$ 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:   sub (new commits)

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

为了理解这一点,您需要知道,当您将子模块放入项目中时,git 不仅会跟踪它的克隆位置,还会跟踪该子模块的最新(或选择的)提交 ID(即其 HEAD)。在签出时,它确保获取子模块的特定版本;如果没有,您在检查旧版本的代码时可能会得到不兼容版本的子模块。

Git 告诉您子模块的 HEAD 提交 ID 已更改,您可以将该更改提交到父项目。如果您执行 a git diff,您将看到更改后的提交 ID(您的 ID 当然会不同):

$ git diff
diff --git a/sub b/sub
index d67371f..07bc855 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit d67371f7485a97dd4d00802619f93a0cb4d2df16
+Subproject commit 07bc855dd4d958783a686241b911aead1d73ca3c

没关系为什么子模块签出的 HEAD 提交 ID 已更改;git pull就父项目而言,拉取子模块的新版本(例如,在子模块目录中)或在子模块目录中本地提交都做同样的事情 - 通过添加更多提交来更改子模块 HEAD 提交 ID 。

答案2

据我所知,mfurseman 的评论是最好的解决方案:

git submodule update --init --recursive

相关内容