定义 gitignore 的配置文件

1
2
3
4
5
.gitignore

$GIT_DIR/info/exclude

$HOME/.config/git/ignore

gitignore 用于配置Git仓库中不需要加入版本管理的文件。如果文件已经被Git追踪则不受gitignore影响。

gitignore 语法规则

  • 空行不匹配任何文件,所以可以用空行来增强gitignore规则的可读性
  • 注释行以#开头。可以在#前加一个反斜杠转义之,使之能够匹配包含”#”字符的文件夹或文件
  • 如果每一行最后尾随的空格没有用反斜杠转义,那么这些空格是无效的,不会作为规则的一部分
  • 使用!前缀来否定之前的规则。如果一个文件被前面的gitignore规则给匹配到了,那么该文件不会被Git追踪,但是如果后面的规则使用!匹配到了该文件,那么该文件又会被Git追踪。当然,如果一个文件的父目录都被Git忽略了,那么无论如何,这个文件都不会被Git追踪。出于性能考虑,Git不会遍历被忽略的目录,因此,定义在被忽略目录下的gitignore规则都是无效的。有时候,我们真的是想忽略以感叹号!开头的一个文件或者目录,这时,可以在感叹号!前面加一个反斜杠转义之,比如:!important.txt会匹配文件!important.txt
  • 如果一个规则以斜杠结尾,在实际匹配的时候,最后的斜杠会被移除掉,但是这个规则只会匹配目录,而不会匹配文件。换句话说,foo/会匹配到目录foo和foo下的子目录,但不会匹配到文件foo或者软链接foo
  • 如果规则中不包含斜杠/,Git就会就会把该规则当成通配符规则来进行处理,从该规则所在.gitignore文件所在路径开始匹配。(如果这个规则不是放在.gitignore文件中的,就会从work tree的顶部开始匹配)
  • 如果规则不符合以上的情况,那么Git就会把这个规则当成shell glob 模式匹配。所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
  • 以斜杠开头的通配符规则从路径开头开始匹配。比如,/*.c匹配cat-file.c,但不匹配mozilla-sha1/sha1.c

两个连续的星号**在匹配全路径名的时候可能有特殊含义:

  • 规则以两个星号开头,后接一个斜杠,这样的规则会在所有路径或子路径中尝试进行匹配。比如,/foo会匹配到文件foo或者目录foo,无论它在哪个目录;foo这条规则同样会尝试匹配所有路径中的文件foo或者目录foo。**/foo/bar规则会匹配任意文件或目录foo下直接跟的文件bar或目录bar
  • 如果规则中间有连续的两个星号**,那这条规则会匹配下面的所有东西。比如abc/**会匹配目录abc下的所有文件或目录,当然,这里的目录abc是相对于.gitignore文件位置而言的,无限递归
  • 如果规则是斜杠/后跟两个星号,然后再跟一个斜杠的形式,这里的两个星号就会匹配0+个目录,这里的0+是指可以没有,也可以是多个。再举个例子,比如a/**/b会匹配a/b、a/x/b、a/x/y/b这些
  • 其他形式的连续星号都认为是无效的。

各种语言的 gitignore 配置文件模板

https://github.com/github/gitignore