我應該這樣做的伎倆:忽略根的所有文件,除了一些特定的文件,目錄
*
!/dir1/
!/dir2/
!/file1
!/file2
但出乎我的意料,它沒有。這似乎工作,如果我在星號前加上斜線。但我不明白爲什麼在這個變化之前它不起作用。有人可以指出嗎?
我應該這樣做的伎倆:忽略根的所有文件,除了一些特定的文件,目錄
*
!/dir1/
!/dir2/
!/file1
!/file2
但出乎我的意料,它沒有。這似乎工作,如果我在星號前加上斜線。但我不明白爲什麼在這個變化之前它不起作用。有人可以指出嗎?
要使用否定模式!
在.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
大。在我看來,'/ *'解決方案是最好的選擇之一。因爲它會讓'git'重新包含最少量的文件。 – 2014-10-02 17:45:59
看看這個大棚任何見解http://stackoverflow.com/questions/9162919/whitelisting-and-subdirectories-in-git – 2014-10-01 16:27:27