2011-02-26 95 views
50

我最近重新組織我的文件夾,在~/Dropbox/dotfiles的Git存儲庫中生存,我使用病原體捆綁了~/Dropbox/dotfiles/home/.vim/bundle中的所有Vim插件。這些插件被添加爲Git子模塊。.gitignore文件添加到Git子模塊內

現在的問題是,當我運行Vim時,它會自動生成所有插件的文檔,並將它們放入每個子模塊目錄中。這將未追蹤的內容添加到子模塊,我想避免這些內容。

[email protected] ~/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子模塊內的文件和文件夾的方法,或者可能配置Vim在Git存儲庫之外的文件夾中創建文檔?

編輯:蘭迪·莫里斯指出,這可能是Generating tags to different location by pathogen

+0

可能重複:http://stackoverflow.com/questions/4343544/generating-tags-to-different-由病原體定位#4346300 – 2011-02-26 13:39:14

+0

你是對的。去標記問題。謝謝! – rubiii 2011-02-26 14:00:10

+1

注意:'.gitignore'中的'**'並不意味着「在任何深度」。 – 2011-05-05 18:08:11

回答

64

重複你應該在每個子模塊的添加.gitignore
由於上述子模塊類似於嵌套Git回購,因此他們會照顧自己的忽略規則,並且其狀態不會受到父回購的.gitignore(如explained here)的影響。

對於特定VIM設定,如Randy Morris提到的評論,看到SO質疑「Generating tags to different location by pathogen」。


注:爲Nick提到這個意見,並回答所示爲「Generating tags to different location by pathogen」,一個配置,如:

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

會工作並作出子模塊通過git status忽略。
但是「ignore = untrackedmeans at least Git1.7.2


注:nurettin提到in the comments

ignore = dirty爲我做

Commit aee9c7d詳情untrackeddirty之間的差異。

  • dirty」:只有在提交記錄在上層項目和HEAD將考慮修改子模塊,所有子模塊的工作樹的變化將被忽略的差異。
    使用此值時,子模塊根本不會掃描工作樹更改,從而在大型子模塊上帶來性能優勢。

  • untracked」:只有在子模塊未跟蹤文件工作樹被忽略,一改HEAD和/或修改在子模塊文件將其標記爲修改。

+0

我不喜歡修改其他人的Git倉庫,但'ignore = untracked'選項工作得很好。非常感謝你! – rubiii 2011-02-26 13:45:47

+1

您至少需要git 1.7.2版以使ignore = untracked設置無效。看到這裏的評論:http://stackoverflow.com/questions/4343544/generating-tags-to-different-location-by-pathogen/4346300#4346300 – 2011-06-17 01:33:22

+1

@尼克:好點。我已經將它包含在答案中。 – VonC 2011-06-17 06:35:01

-2

我認爲這裏的基本問題是,您正試圖忽略「跟蹤」的變化。 .gitignore忽略只對回購的'未跟蹤'變化。要驗證您可以修改您的倉庫中的某個文件(已跟蹤)並將其添加到您的.gitignore文件中。在執行git status時,您會看到該文件仍被列爲「已修改」。您的子模塊回購也被認爲是由您的主回購商跟蹤的,因此,簡單地向母回購添加gitignore將不起作用。正如其他人所建議的,要麼添加.gitignore個人回購規則,要麼使用最近的git版本,您可以使用git status --ignore-submodules

+1

nope。這些文件是新的,它們是'未跟蹤'的。抱歉,但這並不能解決問題。 – rubiii 2012-01-03 20:42:23

8

VonC的建議ignore = untracked有效,但您必須對每個此類子模塊進行更改。

如果要解決這個問題一勞永逸,您可以配置在每個混帳回購全局gitignore模式,通過git config --global core.excludesfile ~/.gitignore_global,然後只需添加doc/tags至$ HOME/.gitignore_global。

請參閱https://help.github.com/articles/ignoring-files

1

本的答案是一個好的開始。但對於這種特定的忽視規則,我不喜歡全球化的設置。

身高本地配置的每個子模塊,並集中忽略子模塊根庫文件:

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