一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。
通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件的模式。
.gitignore
文件用来忽略被指定的文件或文件夹的改动,被记录在.gitignore
文件里的文件或文件夹,是无法被git跟踪到的,即被忽略的文件是不会被放入到远程仓库里的。如果文件已经存在于远程仓库中,是无法通过.gitignore
文件来忽略的。
.gitignore 文件的格式规范(语法)
- 所有空行或者以
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(
/
)开头防止递归。 - 匹配模式可以以(
/
)结尾指定目录。 - 以叹号
!
表示不忽略(跟踪)匹配到的文件或目录。
glob 模式是指 shell 所使用的简化了的正则表达式。
- 星号(
*
)匹配零个或多个任意字符; - 问号(
?
)只匹配一个任意字符; [ ]
表示匹配中括号内的单个字符:
(1)[abc]
要么匹配一个 a,要么匹配一个 b,要么匹配一个 c
(2) 可以使用-
来表示连贯的字符,比如0-9
,a-z
,A-Z
等,[0-9]
表示匹配从0到9的单个字符。
(3) 可以使用^
来表示除外,比如[^0-9]
表示除0到9之外的单个字符。- 使用两个星号(
\**
)表示匹配任意中间目录,比如a/**/z
可以匹配a/z
、a/b/z
或a/b/c/z
等。
.gitignore 文件示例
# 忽略所有的 .a 文件
*.a# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO# 忽略任何目录下名为 build 的文件夹,等价于 build/*.*
build/# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
.gitignore文件使用的注意事项
- 在首次提交正式数据前,先创建提交
.gitignore
文件到本地库(再推送到远程库)。
注意: 在git早期版本中,只有先提交.gitignore
文件到本地库后,才能对提交的正式数据采用过滤规则(在git2.+
以上版本中无需先提交.gitignore
文件,只要保证在首次添加/提交正式数据前.gitignore
文件已存在且设置好过滤规则,但为了标准化 git 的操作,建议先提交推送.gitignore
到远程库)。 - 对在添加
.gitignore
之前,已提交到本地库(或推送到远程库的数据),不会受到过滤规则的影响。
因而必须先提交、推送.gitignore
。 - 在提交、推送
.gitignore
之后,需要更新它的过滤规则,必须先修改/提交/推送到远程库后,再提交正式数据,防止不必要的数据的提交。