1. 程式人生 > >筆記-git-.gitignore

筆記-git-.gitignore

筆記-git-.gitignore

 

1.      git忽略檔案

有的檔案不需要提交到公共倉庫中,為此git提供了三種實現方式。

  1. gitignore檔案
  2. 在專案的設定中指定排除檔案
  3. 定義全域性.gitgnore檔案

絕大多數情況下使用.gitignore就足夠了。

對.gitignore並不陌生,但在使用時總是有些不稱手,總結了一下它的常用方法。

 

1.1.    使用

在目錄下建立.gitignore檔案;

在檔案中新增忽略規則;

使用git add *命令時會忽略滿足.gitignore檔案中定義規則的檔案;

 

2.      過濾規則

2.1.    優先順序

在 .gitingore 檔案中,每一行指定一個忽略規則,Git檢查忽略規則的時候有多個來源,它的優先順序如下(由高到低):
1)從命令列中讀取可用的忽略規則
2)當前目錄定義的規則
3)父級目錄定義的規則,依次遞推
4)$GIT_DIR/info/exclude 檔案中定義的規則
5)core.excludesfile中定義的全域性規則

 

2.2.    規則語法

在.gitignore檔案中應遵循下述語法:

  1. #開頭代表註釋行,如果檔名中包含#可使用轉義;
  2. 空格不匹配任意檔案,可作為分隔符,可用轉義
  3. 以/表示目錄,"/"結束的模式匹配資料夾以及在該資料夾路徑下的內容,但是不匹配該檔案;"/"開始的模式匹配專案跟目錄;如果一個模式不包含斜槓,則它匹配相對於當前 .gitignore 檔案路徑的內容,如果該模式不在 .gitignore 檔案中,則相對於專案根目錄;
  4. 以星號"*"通配多個字元,即匹配多個任意字元;使用兩個星號"**" 表示匹配任意中間目錄,比如`a/**/z`可以匹配 a/z, a/b/z 或 a/b/c/z等;
  5. 以問號"?"通配單個字元,即匹配一個任意字元;
  6. 以方括號"[]"包含單個字元的匹配列表,即匹配任何一個列在方括號中的字元。比如[abc]表示要麼匹配一個a,要麼匹配一個b,要麼匹配一個c;如果在方括號中使用短劃線分隔兩個字元,表示所有在這兩個字元範圍內的都可以匹配。比如[0-9]表示匹配所有0到9的數字,[a-z]表示匹配任意的小寫字母);
  7. 以歎號"!"表示不忽略(跟蹤)匹配到的檔案或目錄,即要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎號(!)取反。需要特別注意的是:如果檔案的父目錄已經被前面的規則排除掉了,那麼對這個檔案用"!"規則是不起作用的。也就是說"!"開頭的模式表示否定,該檔案將會再次被包含,如果排除了該檔案的父級目錄,則使用"!"也不會再次被包含。可以使用反斜槓進行轉義。

 

需要謹記:git對於.ignore配置檔案是按行從上到下進行規則匹配的,意味著如果前面的規則匹配的範圍更大,則後面的規則將不會生效;

 

.gitignore忽略規則簡單說明:

 

#            表示此為註釋,將被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/           表示過濾整個資料夾

/mtk/do.c       表示過濾某個具體檔案

 

被過濾掉的檔案就不會出現在git倉庫中(gitlab或github)了,當然本地庫中還有,只是push的時候不會上傳。

 

需要注意的是,gitignore還可以指定要將哪些檔案新增到版本管理中,如下:

!*.zip

!/mtk/one.txt

 

唯一的區別就是規則開頭多了一個感嘆號,Git會將滿足這類規則的檔案新增到版本管理中。

 

----------------------------------------------------------------------------------

還有一些規則如下:

fd1/*

說明:忽略目錄 fd1 下的全部內容;注意,不管是根目錄下的 /fd1/ 目錄,還是某個子目錄 /child/fd1/ 目錄,都會被忽略;

 

/fd1/*

說明:忽略根目錄下的 /fd1/ 目錄的全部內容;

 

/*

!.gitignore

!/fw/

/fw/*

!/fw/bin/

!/fw/sf/

說明:忽略全部內容,但是不忽略 .gitignore 檔案、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;注意要先對bin/的父目錄使用!規則,使其不被排除。