天天看點

Git 忽略不需要跟蹤的檔案工作經曆.gitignore 規則glob 模式例子

工作經曆

公司有時候把一些項目交給一些不熟悉Git的人來管理,他們從伺服器下載下傳了代碼後,不去先執行Git倉庫初始化,而是先去編譯代碼。代碼編譯完成之後,會生成很多中間檔案(例如日志檔案,臨時檔案等等),然後他們把代碼,并且連帶這些中間檔案,一起送出了。我們下載下傳了這個Git倉庫代碼,每交編譯完成,通過Git檢視狀态,會發現一大堆的已修改的中間檔案,非常礙眼。

正确的方式應該是下載下傳代碼後,先初始化Git倉庫,把代碼納入Git管理。再編譯代碼,檢視生成的中間檔案的,建立

.gitignore

檔案來忽略這些中間檔案。

.gitignore 規則

.gitignore

檔案有以下規則

  1. 以#開關的行是注釋行,它會被Git忽略 。
  2. 它使用标準的 glob 模式進行比對,并且會遞歸地應用在整個工作區中。
  3. 比對模式以 / 開頭,表示比對的是目前目錄。
  4. 比對模式以 / 結尾,表示比對的是目錄。
  5. 如果在模式前面加上感歎号,表示規則取反。

glob 模式

這些規則,就隻有一個難點,什麼是 glob 模式? 規則如下

  1. 星号(*)比對零個或者多個任意字元。
  2. 問号(?)隻比對一個字元。
  3. []

    比對括号内的任意一個字元,例如

    [abc]

    比對a 或 b 或 c,

    [a-z]

    比對所有的小寫字元,

    [0-9]

    比對所有數字。
  4. **

    比對任意中間目錄 ,例如

    ac

    可以比對

    a/b/c

    ,也可以比對

    a/b/d/c

這裡的glob模式和Vim中搜尋檔案路徑中所使用的glob模式是一樣的,但是不知道與shell中的通配符是否有關系。

例子

假如現在 Git 倉庫下,經過編譯後,有如下的生成檔案

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	dir1/world.o
	hello.o
	out/ 
	build/out/result.txt
           

有兩個以

.o

結尾的檔案,一個在目前目錄下,一個在 dir1 目錄下,如果我們想同時忽略這兩個檔案,可以在

.gitignore

中增加如下一行

# 遞歸整個工作區,忽略所有以 .o 結尾的檔案
`*.o`
           

這兩個中間檔案不在同一個目錄,為何會同時忽略?注意規則2所說的,glob 模式會遞歸地應用到整個工作區。

如果我們隻想忽略除了 hello.o 以下的其它中間檔案,那麼可以使用如下指令

# 遞歸整個工作區,忽略所有的以 .o 結尾的檔案
*.o
# 但是排除 hello.o
!hello.o
           

如果我們隻想忽略目前目錄下的 out 目錄,那麼添加如下一行

# 忽略目前目錄下的 out 目錄 
/out/
           

第一個 / 表示目前目錄,第二個 / 表示 out 是一個目錄。

在工作區中,有兩個 out 目錄 ,如果我們想同時忽略它們,可以添加如下一行

# 遞歸整個工作區,忽略所有的 out 目錄
out/
           

/out/

out/

的差別在于,

/out/

隻忽略目前目錄下的 out 目錄,而

/out/

會遞歸忽略所有目錄下 out 目錄。

如果使用

**

來忽略

build/out/result.txt

,可以寫成

/build*.o

如果想忽略 build 目錄以及子目錄下的所有的 result.txt 檔案,那麼可以使用

**

# 忽略build目錄以其子目錄下的所有result.txt檔案
/build/**/result.txt