設定與配置
取得與建立專案
基本快照
分支與合併
共享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.42.1 → 2.47.0 無變更
-
2.42.0
08/21/23
- 2.41.1 → 2.41.2 無變更
-
2.41.0
06/01/23
- 2.34.1 → 2.40.3 無變更
-
2.34.0
11/15/21
- 2.33.1 → 2.33.8 無變更
-
2.33.0
08/16/21
- 2.32.1 → 2.32.7 無變更
-
2.32.0
06/06/21
- 2.22.2 → 2.31.8 無變更
-
2.22.1
08/11/19
-
2.22.0
06/07/19
- 2.20.1 → 2.21.4 無變更
-
2.20.0
12/09/18
- 2.19.1 → 2.19.6 無變更
-
2.19.0
09/10/18
- 2.17.0 → 2.18.5 無變更
-
2.16.6
12/06/19
- 2.10.5 → 2.15.4 無變更
-
2.9.5
07/30/17
- 2.5.6 → 2.8.6 無變更
-
2.4.12
05/05/17
- 2.3.10 無變更
- 2.2.3 無變更
-
2.1.4
12/17/14
-
2.0.5
12/17/14
描述
gitignore
檔案指定 Git 應該忽略的刻意不追蹤的檔案。已經被 Git 追蹤的檔案不受影響;詳情請參閱下方的注意事項。
gitignore
檔案中的每一行指定一個模式。當決定是否忽略一個路徑時,Git 通常會檢查來自多個來源的 gitignore
模式,其優先順序如下,從高到低(在同一個優先順序級別內,最後符合的模式決定結果)
-
從支援這些命令的命令列讀取的模式。
-
從與路徑相同的目錄,或任何父目錄(直到工作樹的頂層)的
.gitignore
檔案讀取的模式,較高層級檔案中的模式會被較低層級檔案中的模式覆蓋,直到包含該檔案的目錄。這些模式會相對於.gitignore
檔案的位置進行匹配。專案通常會在其儲存庫中包含此類.gitignore
檔案,其中包含作為專案建置一部分產生的檔案的模式。 -
從
$GIT_DIR/info/exclude
讀取的模式。 -
從組態變數
core.excludesFile
指定的檔案讀取的模式。
要將模式放置在哪個檔案中取決於該模式的預期用途。
-
應該進行版本控制並透過複製分發到其他儲存庫的模式(即所有開發人員都想要忽略的檔案)應該放在
.gitignore
檔案中。 -
特定於某個儲存庫,但不需要與其他相關儲存庫共享的模式(例如,存在於儲存庫中但特定於某個使用者工作流程的輔助檔案)應該放在
$GIT_DIR/info/exclude
檔案中。 -
使用者想要 Git 在所有情況下都忽略的模式(例如,使用者選擇的編輯器產生的備份或臨時檔案)通常會放入使用者
~/.gitconfig
中的core.excludesFile
指定的檔案中。其預設值為 $XDG_CONFIG_HOME/git/ignore。如果 $XDG_CONFIG_HOME 未設定或為空,則會改為使用 $HOME/.config/git/ignore。
底層 Git 工具,例如 *git ls-files* 和 *git read-tree*,會讀取由命令列選項指定的 gitignore
模式,或從由命令列選項指定的檔案讀取。較高層級的 Git 工具,例如 *git status* 和 *git add*,會使用上述來源指定的模式。
模式格式
-
空白行不會匹配任何檔案,因此可以用作分隔符號以提高可讀性。
-
以 # 開頭的行會被視為註解。在第一個雜湊符號 ("
#
") 前面加上反斜線 ("\
"),以表示以雜湊符號開頭的模式。 -
尾隨空格會被忽略,除非它們用反斜線 ("
\
") 括起來。 -
可選的前綴 "
!
" 會否定該模式;任何先前模式排除的匹配檔案都將再次包含。如果該檔案的父目錄被排除,則無法重新包含該檔案。Git 出於效能考量不會列出被排除的目錄,因此無論在哪裡定義,包含檔案的任何模式都不會生效。在第一個 "!
" 前面加上反斜線 ("\
"),以表示以字面 "!
" 開頭的模式,例如,"\!important!.txt
"。 -
斜線 "
/
" 用作目錄分隔符號。分隔符號可以出現在.gitignore
搜尋模式的開頭、中間或結尾。 -
如果模式的開頭或中間(或兩者都有)存在分隔符號,則該模式會相對於特定
.gitignore
檔案的目錄層級。否則,該模式也可能在.gitignore
層級以下的任何層級匹配。 -
如果模式的結尾存在分隔符號,則該模式只會匹配目錄,否則該模式可以匹配檔案和目錄。
-
例如,模式
doc/frotz/
會匹配doc/frotz
目錄,但不會匹配a/doc/frotz
目錄;然而frotz/
會匹配frotz
和a/frotz
(都是目錄)(所有路徑都是相對於.gitignore
檔案)。 -
星號 "
*
" 會匹配任何內容,除了斜線。字元 "?
" 會匹配任何一個字元,除了 "/
"。可以使用範圍表示法,例如[a-zA-Z]
,來匹配範圍中的其中一個字元。有關更詳細的描述,請參閱 fnmatch(3) 和 FNM_PATHNAME 旗標。
針對完整路徑名稱匹配的模式中的兩個連續星號 ("**
") 可能具有特殊含義
-
前導的 "
**
" 後面跟著斜線表示在所有目錄中匹配。例如,"**/foo
" 會在任何地方匹配檔案或目錄 "foo
",與模式 "foo
" 相同。"**/foo/bar
" 會在任何直接位於目錄 "foo
" 下的任何地方匹配檔案或目錄 "bar
"。 -
尾隨的 "
/**
" 會匹配內部的一切內容。例如,"abc/**
" 會匹配目錄 "abc
" 內的所有檔案,相對於.gitignore
檔案的位置,深度無限。 -
斜線後面跟著兩個連續星號,然後再跟著斜線,會匹配零個或多個目錄。例如,"
a/**/b
" 會匹配 "a/b
"、"a/x/b
"、"a/x/y/b
" 等等。 -
其他連續星號會被視為一般星號,並會根據先前的規則進行匹配。
組態
可選的組態變數 core.excludesFile
指示一個包含要排除的檔案名稱模式的檔案路徑,類似於 $GIT_DIR/info/exclude
。排除檔案中的模式會與 $GIT_DIR/info/exclude
中的模式一起使用。
注意事項
gitignore 檔案的目的是確保某些未被 Git 追蹤的檔案保持不被追蹤的狀態。
若要停止追蹤目前正在追蹤的檔案,請使用 *git rm --cached* 從索引中移除該檔案。然後可以將檔案名稱新增至 .gitignore
檔案,以防止該檔案在後續的提交中再次引入。
當從工作樹中存取 .gitignore
檔案時,Git 不會追蹤符號連結。當從索引或樹狀結構而非從檔案系統存取檔案時,這樣可以保持行為一致。
範例
-
模式
hello.*
會匹配名稱以hello.
開頭的任何檔案或目錄。如果只想將其限制在目錄中,而不是子目錄中,則可以在模式前面加上斜線,即/hello.*
;現在該模式會匹配hello.txt
、hello.c
,但不會匹配a/hello.java
。 -
模式
foo/
會匹配目錄foo
及其底下的路徑,但不會匹配一般檔案或符號連結foo
(這與 Git 中路徑規格的一般運作方式一致) -
模式
doc/frotz
和/doc/frotz
在任何.gitignore
檔案中都具有相同的效果。換句話說,如果模式中已經存在中間斜線,則前導斜線並不相關。 -
模式
foo/*
會匹配foo/test.json
(一般檔案)、foo/bar
(目錄),但不會匹配foo/bar/hello.c
(一般檔案),因為模式中的星號不匹配包含斜線的bar/hello.c
。
$ git status [...] # Untracked files: [...] # Documentation/foo.html # Documentation/gitignore.html # file.o # lib.a # src/internal.o [...] $ cat .git/info/exclude # ignore objects and archives, anywhere in the tree. *.[oa] $ cat Documentation/.gitignore # ignore generated html files, *.html # except foo.html which is maintained by hand !foo.html $ git status [...] # Untracked files: [...] # Documentation/foo.html [...]
另一個範例
$ cat .gitignore vmlinux* $ ls arch/foo/kernel/vm* arch/foo/kernel/vmlinux.lds.S $ echo '!/vmlinux*' >arch/foo/kernel/.gitignore
第二個 .gitignore 會防止 Git 忽略 arch/foo/kernel/vmlinux.lds.S
。
範例,排除除特定目錄 foo/bar
之外的所有內容(請注意 /*
- 如果沒有斜線,萬用字元也會排除 foo/bar
內的所有內容)
$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
GIT
屬於 git[1] 套件的一部分