6
前言
在使用 Github
的时候我们有 .gitignore
文件来避免提交一些不需要提交的文件(比如 node_modules
),在使用 eslint
和 prettier
时也有对应的 .eslintignore
和 .prettierignore
,它们的功能都类似,语法也相同,本文就总结一下 ignore
文件的常用语法。
语法
- 空行或是以#开头的行即注释行将被忽略,可用反斜杠转义。
/
用来分隔目录,可以出现在一条pattern
的前中后。如果/
在一条pattern
的最前面或者中间,那么它的匹配仅仅和.gitignore
文件所在位置同一层级的文件或文件夹;而如果/
在一条pattern
的最后则匹配层级除了.gitignore
文件所在层级还包括所有更低层级(嵌套的文件夹),并且只能匹配文件夹,不能匹配文件。举个例子, 一个pattern
:doc/frotz/
会匹配到doc/frotz
文件夹, 但是不会匹配a/doc/frotz
文件夹; 但是frotz/
会匹配frotz
和a/frotz
,两者必须是文件夹 (所有路径都是以.gitignore
文件的位置为基准)- 可以使用
!
来否定忽略,即比如在前面用了*.apk
,然后使用!a.apk
,则这个a.apk
不会被忽略。 *
用来匹配零个或多个字符(不包括/
),如*.[oa]
忽略所有以".o"
或".a"
结尾,*~
忽略所有以~
结尾的文件(这种文件通常被许多编辑器标记为临时文件);[]
用来匹配括号内的任一字符,如[abc]
,也可以在括号内加连接符,如[0-9]
匹配0至9的数,类似正则表达式;?
用来匹配单个字符(不包括/
)。- ** : 与嵌套目录匹配,比如 a/**/z 与以下项匹配
a/z
、a/b/z
、a/b/c/z。 - 可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。
# 忽略 .a 文件
*.a
# 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件
!lib.a
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 文件 在 doc/ directory 下的
doc/**/*.pdf
# /dir 将匹配.gitignore所在层级一个文件,目录,链接,任何名为dir的内容
# /dir/ 将只会匹配.gitignore所在层级一个名为dir的目录
# /dir/* 将匹配所有文件,目录和其他任何在名为dir的目录(也在.gitignore所在层级)里的内容(但是不包括这个目录本身)
# 如果你使用 !.gitkeep 并且有个 dir/.gitkeep 文件,对于 /dir 和 /dir/ 这两种匹配规则,你写的 !.gitkeep 不会生效,因为 Git不会去 dir 文件夹的内部检查;对于 /dir/*,Git会检查.gitkeep,并且dir文件夹会被提交,因为这条模式不会应用到文件夹,而是应用到文件夹里面的内容。
可以用
git check-ignore
来查看我们某个文件是否被忽略,命令的细节查看官方文档。
在 .gitingore
文件中,每一行指定一个忽略规则,Git
检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
1、从命令行中读取可用的忽略规则
2、当前目录定义的规则
3、父级目录定义的规则,依次递推
4、$GIT_DIR/info/exclude
文件中定义的规则
5、core.excludesfile
中定义的全局规则
git
对于 .gitignore
配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;如果你不慎在创建 .gitignore
文件之前就 push
了项目,那么即使你在 .gitignore
文件中写入新的过滤规则,这些规则也不会起作用,Git
仍然会对所有文件进行版本管理。所以在项目创建时就设计好对应的 .gitignore
文件是一个好习惯。