Git子模块与修改和untracked内容 – 为什么以及如何删除它?

这就是我的git status的结果:

 # On branch master # Changed but not updated: # (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: vim/bundle/pathogen (modified content) # modified: vim/bundle/sparkup (untracked content) # no changes added to commit (use "git add" and/or "git commit -a") 

运行git diff vim显示:

 diff --git a/vim/bundle/pathogen b/vim/bundle/pathogen --- a/vim/bundle/pathogen +++ b/vim/bundle/pathogen @@ -1 +1 @@ -Subproject commit fcf77f5101f3e589ce006c40ad3a0432735a05cf +Subproject commit fcf77f5101f3e589ce006c40ad3a0432735a05cf-dirty diff --git a/vim/bundle/sparkup b/vim/bundle/sparkup --- a/vim/bundle/sparkup +++ b/vim/bundle/sparkup @@ -1 +1 @@ -Subproject commit 04a81b41f116a19184359a6f8685c192f5c36c70 +Subproject commit 04a81b41f116a19184359a6f8685c192f5c36c70-dirty 

为什么一个没有跟踪,另一个是修改,差异是什么意思? 但最重要的是:它是如何发生的以及如何去除它?

vim/bundle/pathogen一个跟踪文件已经被修改了。 在子模块vim/bundle/sparkup还有一些未跟踪的(并且是不受限制的)内容。 在这两种情况下,找出被修改/未被跟踪的东西的方法是切换到子模块目录并运行git status 。 (在子模块中没有跟踪文件的情况下,这通常是一个未在上游添加到.gitignore的构build产品。)

ignore = dirty添加到位于repo根目录的.gitmodules文件中的每个有问题的submodule部分。 例:

 [submodule "vim/bundle/nerdtree"] path = vim/bundle/nerdtree url = https://github.com/scrooloose/nerdtree.git ignore = dirty 

正如NilsH的如何忽略git子模块中的更改一样 。 find感谢同步插件与git子模块和病原体 vimcast。

进入子模块的目录,并确保没有任何东西正在build造(某种types的输出)而不知道。

 cd submoduledir/ git status 

如果你在这里看到任何未跟踪的文件,只要做到这一点删除它们:

 git reset --hard HEAD git clean -fxd 

如果你真的确定要这样做(我正在pipe理带有病原和git子模块的vim包,还有一些我如何设法在回收站中获得一些标签文件夹 – 而且他们只需要去),你可以通过子模块删除未跟踪的文件。

 cd YOUR_REPO_WITH_SUBMODULES/ git submodule foreach git clean -f -d 

-f强制, -d删除目录

你可以在这里查看文档: https : //git-scm.com/docs/git-clean

作为FAQ中病原体的作者,您可以忽略全局标签:

 git config --global core.excludesfile '~/.cvsignore' echo tags >> ~/.cvsignore 

您可以使用以下命令清理存储库

 git clean -fd -f is force and git won't do anything without the flat -d is for also removing directories 

如果目录由不同的存储库pipe理,则使用f标志两次将其删除

 git clean -ffd 

文档: git干净