Git中管理該目錄下多級目錄下的檔案
現有以下目錄結構:

目錄.png
假設引用場景(一)
忽略 aaa目錄,但是需要管理aaa目錄下的bbb.txt,除此之外,其他檔案均不需要管理
#忽略aaa/下的所有檔案,注意是aaa/*,而不是aaa/, aaa/* #不忽略aaa/bbb.txt !aaa/bbb.txt
結果:
xx$git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file:aaa/bbb.txt
假設引用場景(二)
繼續場景(一)的需求,還需要管理ddd目錄下的eee.txt,除此之外,其他檔案均不需要管理
#忽略aaa/下的所有檔案,注意是aaa/*,而不是aaa/, aaa/* #不忽略aaa/bbb.txt !aaa/bbb.txt #不忽略aaa/ddd/ !aaa/ddd/ #忽略aaa/ddd 的所有檔案 aaa/ddd/* #不忽略aaa/ddd/eee.txt !aaa/ddd/eee.txt
結果:
xx$ git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file:aaa/bbb.txt new file:aaa/ddd/eee.txt
以此類推,在需要管理多級目錄下的某個檔案時,需要首先對上級目錄"!"不忽略,然後對目錄下"*"忽略所有檔案,最後對目錄下"!"不忽略該檔案。
.gitignore只能忽略那些原來沒有被track的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore是無效的。那麼解決方法就是先把本地快取刪除(改變成未track狀態),然後再提交:
git rm -r --cached . git add . git commit -m 'update .gitignore'
.gitignore註釋用'#', *表示匹配0個或多個任意字元,所以下面面的模式就是要忽略所有的xml檔案,log檔案和apk檔案。
# cat .gitignore *.xml *.log *.apk
在 .gitignore 檔案中,每一行的忽略規則的語法如下:
1)空格不匹配任意檔案,可作為分隔符,可用反斜槓轉義
2)以“#”開頭的行都會被 Git 忽略。即#開頭的檔案標識註釋,可以使用反斜槓進行轉義。
3)可以使用標準的glob模式匹配。所謂的glob模式是指shell所使用的簡化了的正則表示式。
4)以斜槓"/"開頭表示目錄;"/"結束的模式只匹配資料夾以及在該資料夾路徑下的內容,但是不匹配該檔案;"/"開始的模式匹配專案跟目錄;如果一個模式不包含斜槓,則它匹配相對於當前 .gitignore 檔案路徑的內容,如果該模式不在 .gitignore 檔案中,則相對於專案根目錄。
5)以星號" "通配多個字元,即匹配多個任意字元;使用兩個星號" *" 表示匹配任意中間目錄,比如 a/**/z
可以匹配 a/z, a/b/z 或 a/b/c/z等。
6)以問號"?"通配單個字元,即匹配一個任意字元;
7)以方括號"[]"包含單個字元的匹配列表,即匹配任何一個列在方括號中的字元。比如[abc]表示要麼匹配一個a,要麼匹配一個b,要麼匹配一個c;如果在方括號中使用短劃線分隔兩個字元,表示所有在這兩個字元範圍內的都可以匹配。比如[0-9]表示匹配所有0到9的數字,[a-z]表示匹配任意的小寫字母)。
8)以歎號"!"表示不忽略(跟蹤)匹配到的檔案或目錄,即要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎號(!)取反。需要特別注意的是:如果檔案的父目錄已經被前面的規則排除掉了,那麼對這個檔案用"!"規則是不起作用的。也就是說"!"開頭的模式表示否定,該檔案將會再次被包含,如果排除了該檔案的父級目錄,則使用"!"也不會再次被包含。可以使用反斜槓進行轉義。
需要謹記: git對於.ignore配置檔案是按行從上到下進行規則匹配的,意味著如果前面的規則匹配的範圍更大,則後面的規則將不會生效;
#表示此為註釋,將被Git忽略 *.a表示忽略所有 .a 結尾的檔案 !lib.a表示但lib.a除外 /TODO表示僅僅忽略專案根目錄下的 TODO 檔案,不包括 subdir/TODO build/表示忽略 build/目錄下的所有檔案,過濾整個build資料夾; doc/*.txt表示會忽略doc/notes.txt但不包括 doc/server/arch.txt bin/:表示忽略當前路徑下的bin資料夾,該資料夾下的所有內容都會被忽略,不忽略 bin 檔案 /bin:表示忽略根目錄下的bin檔案 /*.c:表示忽略cat.c,不忽略 build/cat.c debug/*.obj:表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj **/foo:表示忽略/foo,a/foo,a/b/foo等 a/**/b:表示忽略a/b, a/x/b,a/x/y/b等 !/bin/run.sh表示不忽略bin目錄下的run.sh檔案 *.log:表示忽略所有 .log 檔案 config.php:表示忽略當前路徑的 config.php 檔案 /mtk/表示過濾整個資料夾 *.zip表示過濾所有.zip檔案 /mtk/do.c表示過濾某個具體檔案