Git diff表示子项目很脏
我刚刚运行了一个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
这是什么意思? 我如何解决它?
正如Mark Longair的博客文章Git Submodules Explained所述,
git的1.7.0及更高版本在git子模块的行为中包含一个恼人的变化。
如果子模块具有任何修改的文件或未跟踪的文件 ,则子模块现在被认为是脏的 ,而以前只有在子模块中的HEAD指向错误的提交时才会出现这种情况。
加号(的意思+
Git中的子模块的输出)发生了变化,并在第一时间,你遇到这一点,需要一点时间看,通过更改日志或使用Git平分上找出什么错误,例如git.git找到变化。 对于“在指定的版本中,但是脏的”引入不同的符号,用户会更加友善。
你可以通过以下方式解决它
在回到父回购站(diff应该不再报告“脏”文件)之前,在每个子模块中提交或撤消更改/发展。 要撤消对子模块的所有更改,只需cd
进入子模块的根目录并执行git checkout .
dotnetCarpenter评论说你可以做一个: git submodule foreach --recursive git checkout .
或者在你的git diff
添加--ignore-submodules
,暂时忽略那些“脏”的子模块。
Git 1.7.2版新增功能
正如下面的Noam注释,这个问题提到,自从git版本1.7.2以后,您可以忽略脏子模块:
git status --ignore-submodules=dirty
也删除子模块,然后运行git submodule init
和git submodule update
显然会做的伎俩,但可能并不总是适当或可能的。
这是因为您对子模块的指针不是子模块目录中的实际指针。 要解决这个问题,你必须再次运行git submodule update
: