内容说明
在 Git 中,可以使用 .gitignore
文件来忽略哪些文件不需要进行跟踪。该文件的内容格式说明:
- 所有空行不匹配任何文件或目录,仅作为内容的分隔符来方便阅读
- 以 "
#
" 开头的行表示注释 - 每一行都表示一个忽略规则(模式匹配)
- 冲突的内容可使用 "
\
" 进行转义。比如以 "#
" 开头的行是注释行,若要让 "#
" 的含义失效,可使用 "\#
" - 在忽略时,Git 会将 .gitignore 文件内容从上到下进行读取并依次按照顺序进行匹配
- .gitignore 文件可以存放在当前项目目录下,也可以存放在项目目录的子目录中,也可以存放在当前用户的家目录中(
~/.gitignore
),Git 会从多个来源检查忽略规则(模式匹配),这涉及到忽略规则的优先级问题,后面介绍 - 以 "
/
" 开头表示作用于当前目录的分隔符,它可以出现在 .gitignore 文件的开头、中间以及结尾。比如我将 .gitignore 存放在项目目录下,则 "/" 就是表示从项目的根开始匹配 - 以 "
/
" 结尾表示忽略该目录,结尾没有 "/
" 表示既可以匹配文件,也可以匹配目录 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号 "
!
" 取反。使用时请注意!如果文件所在的目录已经被忽略排除了,即使使用 "!
" 也不会再次包含 - "
*
" 表示匹配除 "/
" 以外的任意字符 - "
?
" 表示匹配除 "/
" 以外的任何单个字符 - 范围匹配,如
[a-zA-Z]
表示匹配范围内的任意一个字母字符,[1-9]
表示匹配任意一个数字字符。也可以在范围匹配上取反,如[!a-zA-Z]
表示匹配任意的单个非字母字符 -
"
**
" 具有特殊含义:- "
**
" 后跟 "/
" 表示匹配所有的目录,例如 "**/foo
" 可以匹配任意路径下的 foo 文件或目录,其等同于 "foo
"。"**/foo/bar
" 匹配位于目录 "foo
" 下的 "bar
" 文件或目录。 - "
/**
" 表示匹配其中的所有内容。例如 "abc/**
" 表示递归匹配 "abc
" 目录下的所有内容 - "
/
" 后跟 "**
" 和 "/
",可匹配 0 个或多个目录。比如 "a/**/b
" 表示可以匹配a/b
、a/x/b
、a/x/y/b
等
- "
有些同学可能会想知道 "abc/*
" 和 "abc/**
" 的区别,如下表所示:
模式匹配 | 范围 | 示例 |
---|---|---|
abc/* | 仅匹配 abc 目录的直接子项(非递归) | 匹配 abc/file.txt ,但不匹配 abc/subdir/file.txt |
abc/** | 递归匹配 abc 目录及其所有子目录内容 | abc/file.txt 和 abc/subdir/file.txt 均匹配 |
忽略规则的优先级
由高到低依次是:
- 命令行中读取到的可用忽略规则
- .gitignore 文件离项目的根目录越远(换个说法,.gitignore 所在的文件路径越深),表示优先级越高。每个 .gitignore 文件仅对自身所在目录及子目录生效,例如根目录的规则可影响整个项目,但子目录的规则会覆盖上级同名规则。例如,假设 a 是项目的根目录,有
/tmp/a/.gitignore
、/tmp/a/dir1/.gitignore
、/tmp/a/dir2/dir2-1/.gitignore
这样的三个 .gitignore 文件,表示忽略规则的由低到高。 .git/info/exclude
文件- 配置变量 core.excludesFile 的值(
~/.gitignore
)
示例
-
忽略所有以 .a 结尾的文件
*.a # 或者 **/*.a
-
跟踪所有的 lib.a,即便在该行的前面忽略了 .a 文件
*.a !lib.a
-
只忽略当前目录下的 build 文件,而不忽略子目录的 build 文件(例如 subdir/build)
/build
-
忽略 public 目录
public/
-
忽略 public 目录下的子项内容
public/*
-
忽略 doc/notes.txt 文件,但不忽略 doc/server/arch.txt 文件
doc/*.txt
-
忽略 doc/ 目录下及其所有子目录下的 .pdf 文件
doc/**/*.pdf
-
忽略所有 temp.log 文件
temp.log # 或者 **/temp.log
-
忽略所有以 img 开头的文件
img* # 或者 **/img*
-
"
!
" 的注意事项这样写入之后,并不会再次包含 access.log 文件,因为该文件所在的目录已经被提前排除了。
public/ !public/access.log
正确的写法:
public/* !public/access.log
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它。使用者找到适合当前编程语言的 .gitignore 文件并进行适当的修改即可。
注意事项
可使用 git check-ignore -v {File-Name | DIR-Name}
来检查文件或目录是否被忽略掉,若文件或目录被忽略了,则会有输出内容。
一旦特定的文件或目录符合忽略规则,则正常情况下使用 git add
将无法跟踪这些文件或目录,若您确实需要跟踪这些被忽略的文件,可使用 -f
选项:
Shell > git add -f
.gitignore 只能忽略那些历史过往没有被 Git 追踪过的文件或目录,但若被忽略的文件或目录已经被 Git 跟踪,可执行以下命令:
Shell > git rm -r --cache {File-Name | DIR-Name}
Shell > git add {File-Name | DIR-Name}
Shell > git commit
