# gitignore
> 原文: [https://git-scm.com/docs/gitignore](https://git-scm.com/docs/gitignore)
## 名稱
gitignore - 指定要忽略的故意未跟蹤文件
## 概要
$ XDG_CONFIG_HOME / git / ignore,$ GIT_DIR / info / exclude,.gitignore
## 描述
`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`”。
* 如果模式以斜杠結尾,則為了以下描述的目的將其刪除,但它只會找到與目錄的匹配項。換句話說,`foo/`將匹配目錄`foo`和它下面的路徑,但不匹配常規文件或符號鏈接`foo`(這與在Git中一般使用pathspec的方式一致)。
* 如果模式不包含斜杠 _/_ ,Git會將其視為shell glob模式,并檢查相對于`.gitignore`文件位置的路徑名匹配(相對于工作的頂層)樹,如果不是來自`.gitignore`文件)。
* 否則,Git將模式視為shell glob:“`*`”匹配除“`/`”之外的任何內容,“`?`”匹配除“`/`”之外的任何一個字符,并且“`[]`”匹配一個字符選定的范圍。有關更詳細的說明,請參閱fnmatch(3)和FNM_PATHNAME標志。
* 前導斜杠與路徑名的開頭匹配。例如,“/ *。c”匹配“cat-file.c”但不匹配“mozilla-sha1 / sha1.c”。
與完整路徑名匹配的兩個連續星號(“`**`”)可能具有特殊含義:
* 前導“`**`”后跟斜杠表示在所有目錄中匹配。例如,“`**/foo`”在任何地方匹配文件或目錄“`foo`”,與模式“`foo`”相同。 “`**/foo/bar`”將文件或目錄“`bar`”匹配在“`foo`”目錄下的任何位置。
* 尾隨“`/**`”匹配內部的所有內容。例如,“`abc/**`”匹配目錄“`abc`”內的所有文件,相對于`.gitignore`文件的位置,具有無限深度。
* 斜杠后跟兩個連續的星號,然后斜杠匹配零個或多個目錄。例如,“`a/**/b`”匹配“`a/b`”,“`a/x/b`”,“`a/x/y/b`”等。
* 其他連續的星號被認為是常規星號,并且將根據先前的規則匹配。
## 筆記
gitignore文件的目的是確保Git未跟蹤的某些文件保持未跟蹤。
要停止跟蹤當前跟蹤的文件,請使用 _git rm --cached_ 。
## 例子
```
$ 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-rm [1]](https://git-scm.com/docs/git-rm) , [gitrepository-layout [5]](https://git-scm.com/docs/gitrepository-layout) , [git-check-ignore [1]](https://git-scm.com/docs/git-check-ignore)
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree