2014-10-01 45 views
2

我應該這樣做的伎倆:忽略根的所有文件,除了一些特定的文件,目錄

* 
!/dir1/ 
!/dir2/ 
!/file1 
!/file2 

但出乎我的意料,它沒有。這似乎工作,如果我在星號前加上斜線。但我不明白爲什麼在這個變化之前它不起作用。有人可以指出嗎?

+0

看看這個大棚任何見解http://stackoverflow.com/questions/9162919/whitelisting-and-subdirectories-in-git – 2014-10-01 16:27:27

回答

3

要使用否定模式!.gitignore,只記得2條規則。

規則1.文件和目錄在模式中分開處理。包含一個目錄並不意味着它的子文件/目錄也被包含在後面。

I.E.目標是排除除/dir1以外的所有文件/目錄。以下不起作用。

# CANNOT work 
* 
!/dir1/ 

爲什麼?原因只是第一條規則。雖然目錄dir1被再次包括,但不是所有的子文件/目錄。只有包含沒有其子代的目錄意味着什麼都不要亂,因爲git不會跟蹤空文件夾。

作爲比較,以下作品。

# works 
/* 
!/dir1/ 

爲什麼?因爲/*只能直接匹配根目錄下的文件/目錄,而不會忽略子目錄下的任何文件/目錄,如dir1。在!/dir1/包含dir1之後,它的所有子文件/目錄都回來了。

有人會問,如果是這樣,爲什麼以下不起作用,因爲!/dir1/**會包含所有子文件/目錄dir1

# CANNOT work 
* 
!/dir1/** 

的原因是在規則2

規則2.不包括的文件/目錄回來,如果他們的父目錄是被忽略。對於此規則,請首先閱讀my answer to a SO question

這就是爲什麼以前的模式將無法正常工作。如果我們添加另一個否定模式以便首先包含父目錄dir1,它就可以工作。

# works 
* 
!/dir1/ 
!/dir1/** 

理解2條規則後,對OP的情況下,解決方案是非常簡單的。

以下的作品。

/* 
!/dir1/ 
!/dir2/ 
!/file1 
!/file2 

以下內容也適用。

* 
!/dir1/ 
!/dir1/** 
!/dir2/ 
!/dir2/** 
!/file1 
!/file2 

爲了簡化如下。

* 
!*/ 
!/dir1/** 
!/dir2/** 
!/file1 
!/file2 
+0

大。在我看來,'/ *'解決方案是最好的選擇之一。因爲它會讓'git'重新包含最少量的文件。 – 2014-10-02 17:45:59

相關問題