Git子模块显示新的提交,子模块状态表明什么都没提交


47

在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)

如果我在repo上进入src / repo和git status,它表示没有任何内容可提交。

为什么我的顶级git repo抱怨?

Answers:


42

这是因为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

1
如果我不想在主仓库中添加任何提交怎么办?我的用例是-我有一个主存储库,然后有它的Wiki,它也是一个存储库(在GitHub和Bitbucket中可用)。现在,我已经将Wikiwiki作为子模块添加到目录Wiki中。我不希望来自wiki(即Wiki目录)的任何更改都反映在我的主代码存储库中。如果我只是添加.gitmodules 路径在我的.gitignore主仓库的?我应该怎么做?
yadav_vi '16

14
就我而言,我要做的就是从主存储库更新子模块本身。像这样的东西:git submodule update src/repo
–AgustínAmenabar,2013年

19

我遇到了同样的问题,我能够使用@AugustinAmenabar在已接受答案的评论部分中提供的解决方案。我的设置有点复杂,所以我添加了--recursive标志以使所有依赖项保持最新。

git submodule update src/repo --recursive

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.