我刚刚运行了一个git diff,我得到以下输出的所有我的大约10个子模块

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

这是什么意思?我该怎么解决呢?


当前回答

在我的例子中,我不确定是什么导致了这种情况的发生,但我知道我只是想让子模块被重置到它们最新的远程提交,然后完成它。这涉及到把这里几个不同问题的答案结合起来:

Git子模块更新——递归——远程——初始化

来源:

如何将我的更改恢复到git子模块?

简单的方法拉最新的所有git子模块

其他回答

同样,删除子模块,然后运行git子模块init和git子模块update显然也可以达到这个目的,但可能并不总是合适的或可能的。

编辑:这个答案(和其他大多数答案)已经过时了;请参阅Devpool的答案。


最初,没有配置选项使“git diff——ignore-submodules”和“git status——ignore-submodules”成为全局默认值(但也请参阅设置命令上的git默认标志)。另一种方法是在你想要忽略的每个子模块上设置一个默认的忽略配置选项(对于git diff和git状态),可以在.git/配置文件中(仅在本地)或.gitmodules中(将由git进行版本控制)。例如:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

Ignore = untracked忽略未跟踪的文件,Ignore = dirty也忽略已修改的文件,Ignore = all也忽略提交。 显然没有办法为所有子模块通配符。

git submodule foreach --recursive git checkout .

这并没有为我做的技巧,但它给了我一个文件列表(在我的情况下只有一个),在子模块中已更改(没有我做任何事情)。

所以我可以转到子模块,git状态显示我的head被分离-> git checkout master, git状态再次看到修改后的文件,git checkout >filename<, git拉和一切正常。

之所以会出现这种情况,是因为子模块的指针并不是子模块目录中的实际内容。要解决这个问题,你必须再次运行git子模块update:

在我的例子中,我不确定是什么导致了这种情况的发生,但我知道我只是想让子模块被重置到它们最新的远程提交,然后完成它。这涉及到把这里几个不同问题的答案结合起来:

Git子模块更新——递归——远程——初始化

来源:

如何将我的更改恢复到git子模块?

简单的方法拉最新的所有git子模块