如果我有一个包含子模块的项目,在子模块中进行更改,然后提交这些更改,则主项目将在该子模块上显示“新提交”。
但是,如果我“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