.gitignore文件添加到Git子模块中

我最近重新组织我的点文件在~/Dropbox/dotfiles的Git仓库中,我使用病原体将~/Dropbox/dotfiles/home/.vim/bundle所有Vim插件~/Dropbox/dotfiles/home/.vim/bundle 。 这些插件被添加为Git子模块。

现在问题是,当我运行Vim时,它会自动生成所有插件的文档,并将其放入每个子模块目录中。 这将未追踪的内容添加到子模块,我想避免。

 ruby-1.8.7-p330@gs ~/Dropbox/dotfiles ‹master*› $ git st # 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: home/.vim/bundle/fuzzyfinder (untracked content) # modified: home/.vim/bundle/l9 (untracked content) # modified: home/.vim/bundle/matchit (untracked content) # modified: home/.vim/bundle/ruby (untracked content) # ... no changes added to commit (use "git add" and/or "git commit -a") 

我试图添加一个.gitignore文件到我的Git仓库的根目录忽略子模块内的所有doc文件夹,但这似乎不工作:

 home/.vim/bundle/**/doc 

我的问题:有没有办法忽略Git子模块内的文件和文件夹,或者可以configurationVim来创buildGit仓库之外的文件夹中的文档?

编辑:正如兰迪·莫里斯(Randy Morris)指出的,这可能是通过病原体将标签生成到不同位置的副本

您应该在每个子模块中添加.gitignore
由于这些子模块就像是嵌套的Git仓库,所以他们会照顾自己的忽略规则,他们的状态不会受到父.gitignore的影响(正如这里所解释的 )。

对于vim特定的设置,正如Randy Morris在评论中提到的那样,请参阅SO问题“ 通过病原体将标记生成到不同的位置 ”。


注意:正如Nick在这个评论中提到的,并且如“ 通过病原体生成标签到不同位置的标签 ”的答案所示,一个configuration如下:

 [submodule "path/to/submodule"] path = path/to/submodule url = http://github.com/username/repo.git ignore = untracked # <==== 

将工作,并使该子模块被git status忽略。
但是“ ignore = untracked ” 意味着至lessGit1.7.2


注意: 在评论中注意到:

ignore = dirty为我做了

提交aee9c7d详细描述了untracked和dirty之间的区别。

  • dirty ”:只logging在超级项目和子模块HEAD中的提交的差异将被视为修改, 子模块的工作树的所有改变将被忽略
    使用此值时,子模块根本不会扫描工作树更改,从而在大型子模块上获得性能优势

  • untracked ”:只有子模块工作树中未跟踪的文件被忽略,更改后的HEAD和/或子模块中的修改文件会将其标记为已修改。

VonC的build议ignore = untracked作品,但是你必须为每个这样的子模块做出改变。

如果你想一劳永逸地解决这个问题,你可以在每个git仓库上configuration一个全局的gitignore模式,通过git config --global core.excludesfile ~/.gitignore_global ,然后添加doc/tags到$ HOME / .gitignore_global 。

请参阅https://help.github.com/articles/ignoring-files

本的回答是一个好的开始。 但是对于这样一个特定的忽略规则,我不喜欢全局设置。

首选每个子模块的本地configuration,以及子模块根存储库中的集中式忽略文件:

 cd .vim/bundle echo "doc/tags" > .gitignore_submodules git submodule foreach git config --local core.excludesfile "../.gitignore_submodules" 

我认为这里的基本问题是,你正在试图忽略“跟踪”的变化。 .gitignore忽略了对回购的唯一“未被跟踪”的变化。 要validation您可以修改您的仓库(跟踪)中的某些文件,并将其添加到您的.gitignore文件。 在做git status你会看到文件仍然被列为“修改”。 您的子模块回购也被认为是由您的主要回购跟踪,因此简单地添加一个gitignore到父回购将无法正常工作。 正如其他人所build议的那样,要么添加.gitignore规则个人回购或者如果您使用最近的git版本,您可以使用git status --ignore-submodules