内容说明
在 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










