我正試圖解決大目錄結構上的gitignore問題,但爲了簡化我的問題,我將它縮小到了以下內容。gitignore排除規則如何實際工作?
我有一個全新的git倉庫兩個文件(FOO,吧)(未提交到目前爲止)以下的目錄結構:
a/b/c/foo
a/b/c/bar
顯然, 'git的狀態-u' 顯示:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
我想要做的是創建一個.gitignore文件,忽略a/b/c中的所有內容,但不會忽略文件'foo'。
如果我創建因此的.gitignore:
c/
然後一個 'git的狀態-u' 同時顯示foo和bar爲忽略:
# Untracked files:
...
# .gitignore
這是我的期望。
現在,如果我添加排除規則foo的,因此:
c/
!foo
按照gitignore手冊頁,我期望這工作。但事實並非如此 - 它仍然忽略富:
# Untracked files:
...
# .gitignore
這不起作用或者:
c/
!a/b/c/foo
無論是做這個的:
c/*
!foo
給出:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
在這種情況下,儘管foo不再是無知的ed,bar也不會被忽略。
.gitignore中規則的順序似乎也不重要。
這還沒有做我所期望的:
a/b/c/
!a/b/c/foo
這一個忽略這兩個foo和酒吧。這不工作
的一種情況是,如果我創建文件/ B/C /的.gitignore和擺在那裏:
*
!foo
但這個問題是,終究會有下,其他的子目錄/ b/c,而且我不希望將每個單獨的.gitignore放入每個項目中 - 我希望創建可以位於每個項目頂部目錄中的「基於項目」的.gitignore文件,並覆蓋所有'標準'子目錄結構。
這也似乎是等同的:
a/b/c/*
!a/b/c/foo
這可能是「工作」,我可以做到最接近,但完整的相對路徑和明確的例外必須指出,這是會如果我在子目錄樹的不同級別中有很多名稱爲'foo'的文件,那就太痛苦了。
總之,無論是我不太明白排除規則是如何工作的,或者他們沒有在目錄(而不是通配符)被忽略在所有的工作 - 通過在/
結束了統治任何人都可以請對此有所瞭解?
有沒有辦法讓gitignore使用像正則表達式那樣明智的東西,而不是這種笨拙的基於shell的語法?
我在github上使用git-1.6.6.1,在Ubuntu/bash3上使用Cygwin/bash3和git-1.7.1。
相關問題:http://stackoverflow.com/questions/2820255/how-do-negated-patterns-work-in-gitignore/2820310#2820310 – Cascabel 2010-06-09 03:37:50