1. 程式人生 > >git .gitignore規則及取消追蹤已追蹤檔案

git .gitignore規則及取消追蹤已追蹤檔案

今天,在Android studio上進行git開發,把本地的檔案通過git push到遠端倉庫,發現很多不必要的檔案也被跟蹤了,導致專案非常大。上網找了一下.gitignore的規則,發現講的都模稜兩可。想想還是得靠自己,去Git官方網站看了官方文件,這裡做個記錄,對官方文件做一下簡單的翻譯。備後續檢視。
官方文件連結:gitignore

gitignore

指定不需要跟蹤的檔案進行忽略。

概要

$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore

描述

一個gitignore檔案指定git需要忽略的檔案。 對git已經跟蹤的檔案不起作用。

具體檢視後續NOTE。

在gitignore檔案中的每一行均指定了一個模式,當決定一個檔案路徑是否需要忽略時,git會以以下順序檢視下列檔案(優先順序從高至低,在同一個優先順序內,最後一個匹配的模式決定是否忽略檔案)。
1. 在命令列上指定的模式。
2. 從相同目錄中的.gitignore檔案中讀取的模式。或者上層目錄中的模式(向上至目錄樹的頂點),但是在越低的目錄級別中優先順序越高(直到檔案所在目錄)。這些.gitignore檔案對與其在相同目錄中的檔案有效。一個專案通常在一個倉庫包含一個.gitignore檔案,檔案指定的模式包括專案的生成檔案。
3. 從.git/ingo/exclude

檔案中讀取的模式
4. 來自配置變數core.excludesFile指定的模式

將哪些檔案放置到哪種模式中取決於取決於這個模式將被怎樣使用:
1. 不應該被版本管理,也不應該被通過clone分發到其他倉庫中的檔案寫入.gitignore檔案中(比如所有人都想忽略的檔案)
Patterns which should be version-controlled and distributed to other repositories via clone (i.e., files that all developers will want to ignore) should go into a .gitignore file.(這個貌似是官網寫錯了,應該是”should not be version-controlled”)
2. 只對一個特定的倉庫有效但是沒有必要與其他倉庫共享(比如,只對一個使用者的流程有效的輔助檔案)應該寫入.git/ingo/exclude

中。
3. 一個使用者希望Git在任何情況下都忽略的檔案(比如備份或臨時檔案),應該新增到core.excludesFile中(使用者的!/.giconfig),如果使用者的$XDG_CONFIG_HOME沒有被設定或者為空, $HOME/.config/git/ignore 將會生效。

模式格式

  1. 空格不匹配檔案,所以可以使用空格分隔符來增加可讀性
  2. #開始的行為註釋,在前面新增一個\可以用來匹配一個以#開頭的檔案。
  3. 結尾空白會被忽略,除非使用\將空格分開
  4. !將取消一個匹配,所有在之前忽略的模式中被忽略的檔案檔案將被重新包括到版本控制中。如果一個檔案的父目錄被忽略了,不可能將該檔案再新增到版本控制中。因為效能的原因,git不會列出所有的被忽略的目錄,針對這些目錄中的檔案的模式,無論在哪個檔案中被指定都無效。
    在第一個!之前新增\將會匹配以!開頭的檔案,比如\!important!.txt
  5. foo/將會匹配foo目錄下的所有檔案以及其子目錄下的所有目錄。萬用字元不會匹配pathnam/下的目錄的的檔案。比如Documentation/*.html 匹配 Documentation/git.html但是不匹配Documentation/ppc/ppc.htmltools/perf/Documentation/perf.html.(*不能跨目錄匹配)
  6. /開頭匹配當前目錄,比如,匹配/*.c匹配cat-file.c但是不匹配mozilla-sha1/sha1.c.
    • **/開頭表示匹配所有目錄,比如,**/foo匹配所有目錄下的foo檔案和foo目錄,和foo效果相同。**/foo/bar匹配所有在foo目錄下的bar檔案和bar目錄。
    • 結尾的/**匹配所有目錄內的檔案。比如abc/**匹配所有abc目錄下的檔案。
    • a/**/b 匹配a/b, a/x/b, a/x/y/b and so on.
    • 其他情況下的**無效

NOTE:取消追蹤一個已被追蹤的檔案

使用git rm --cached