2010-07-03 169 views
5

我有以下.gitignore文件不忽略子目錄中的文件?

*.pyc 

project/app/dist/* 
project/bin/* 
project/etc/* 
project/var/* 

!README.txt 

到目前爲止好,我的大部分README.txt文件不會被忽略,就像我希望它除了project/ect/downloads/README.txt發生。該文件被忽略。爲什麼是這樣?我該如何解決這個問題?

如果我沒有記錯,我可以簡單地將它添加到我的項目中手動,但我想了解我在忽略該文件時做了什麼不正確的操作。

回答

16

的Git不會搜索project/etc/downloads/任何文件,因爲你已經配置它忽略project/etc/*。 「未錨定的」!README.txt模式僅適用於否定排除將要搜索的目錄中的條目(即,本身未被排除的目錄)。

如果排除project/etc/,Git會永遠搜索該目錄中,因此否定排除不能適用於它的內容(甚至沒有一個如此明確爲!project/etc/important-file! - 也許這可以被認爲是一個錯誤?)。

但是,如果排除project/etc/*,Git將搜索該目錄,否定排除可應用於其內容。一個人可能會意識到第二種模式將始終匹配所有文件併爲這兩種模式分配相同的含義,但Git,但Git以不同的方式處理它們。

你可能會認爲project/etc/project/etc/*表示同樣的事情,但Git以不同的方式對待它們,因爲它不會「意識到」第二個匹配目錄中的所有內容。

因此,要獲得!README.txtprojects/etc/downloads/申請,你將不得不取消忽略了目錄,但在!README模式之前忽略它的內容:

project/etc/* 

# "unignore, but ignore the immediate contents of" project/etc/downloads 
# so that subsequent negated patterns can apply to the immediate contents 
!project/etc/downloads/ 
project/etc/downloads/* 

!README.txt 
+0

的排除感謝您的深入響應!我會永遠不會猜到unignore-ignore/*方法:) – 2010-07-04 13:14:25

+0

對於ping一箇舊帖子的道歉,但在這個問題的三個單獨變體上有近十個答案,因此這是我見過的第一個真正令人滿意的解決方案。非常感謝! – 2012-08-27 18:45:08

+0

忽略列表必須以'*'結尾。像'public /'這樣的東西仍然會忽略下一行中的unignore,它必須是'public/*'。 – 2016-08-11 11:47:07

3

在的.gitignore文件,後/項目的/ etc/*,添加兩行:

 
!/project/etc/downloads/ 
/project/etc/downloads/* 
+1

注:這些必須出現在'README.txt'模式爲前!它會影響'project/etc/downloads/*' – 2010-07-03 09:03:23