.gitignore文件语法和常见写法

作者 by adtxl / 2021-07-08 / 暂无评论 / 445 个足迹

1. 语法

  • 空行会被忽略

  • 匹配是区分大小写的,如:/abc 和 /Abc 含义不同

  • # 开头是注释,会被忽略

  • * 表示0-n个字符

  • ** 两个星含义是子目录子子目录等多层匹配

  • ? 匹配1个字符(注意不是0-1个字符!)

  • [] 用来匹配括号内的任一字符,如 [abc],也可以在括号内加连接符,如 [0-9] 匹配0至9的数

  • *~ 忽略所有以~结尾的文件(这种文件通常被许多编辑器标记为临时文件)

  • *.[oa] 忽略所有以".o"或".a"结尾

  • ! 表示不忽略某文件(为什么要特别指出不忽略? 不写规则不就不会被忽略吗?,这是配合使用的,比如要忽略*.log,但是要排除a.log,这种需求就需要使用!)

  • 匹配规则前面别留空格,会让规则失效。如 一个空格Ab?.txt 和 Ab?.txt 是有区别的

注意:

  • 空目录(包括隐藏目录)会被忽略,无法提交追踪
  • 如果不希望空目录被忽略,在里头建.gitkeep文件

2. 例子

2.1 前提约定

2.2.1 约定1

“当前目录、子目录、子子目录…” 的表述包含的目录是:.gitignore文件所在的目录,以及该目录下的所有目录和它们的所有子目录及子子目录… 总之是这颗目录树的所有节点。

例如:

.gitignore文件在 /Users/stonewang/git-ignore-test/.gitignore,即.gitignore文件所在的目录为/Users/stonewang/git-ignore-test/。

如图:

# 该表述包含了dir1、dir2、dir1_sub、dir1_sub2、dir1_sub_sub、dir1_sub_sub2、dir1_sub2_sub
/Users/stonewang/git-ignore-test/
                                                        |-------.gitignore
                                                        |
                                                        |-------dir1
                                                        |               |----dir1_sub
                                                        |                               |-----dir1_sub_sub
                                                        |                               |-----dir1_sub_sub2
                                                        |               |----dir1_sub2
                                                        |                               |-----dir1_sub2_sub
                                                        |
                                                        |-------dir2

2.1.2 其他补充

  • 目录(即文件夹)的名字有各种表现形式,如显示的、隐藏的、带扩展名的和不带扩展名的。例如:dir、.dir、dir.ext、.dir.ext

  • 文件名的形式也各种各样,如显示的,隐藏的,带扩展名的,不带扩展名的。如file、.file、file.ext、.file.ext

  • 在.gitignore中,以 / 结尾的只会匹配目录,不带 / 结尾的匹配文件和目录,注意没有一种写法仅匹配文件的

  • 在Mac和Windows中都不允许文件之间重名,目录之间重名,目录和文件之间重名。不区分大小写

  • 在Mac和Windows中,目录名都是允许带点的,如dir.ext 可以作为目录名(看起来就像文件的扩展名)

2.2 例子

  • 为了表述准确,引入自创数学符号
    • (.gitignore)N 表示.gitignore文件所在的目录+所有子目录包括直接或间接
    • (.gitignore)O 表示.gitignore文件所在的目录,不包括其任何子目录
写法 作用
dir/ 忽略 (.gitignore)N 中的dir目录
/dir/ 忽略 (.gitignore)O 中的dir目录
file 忽略(.gitignore)N 中的file 文件&目录(名为file的目录也会被忽略)
/file 忽略(.gitignore)O 中的file文件|目录
*.log 忽略(.gitignore)N 中的*.log 文件&目录(符合名字的目录也将被忽略)
/dir/file 忽略(.gitignore)O 中的dir目录下的file文件|目录
/dir/Abc* 和 /dir/Abc*.java 和/dir/*.java 忽略(.gitignore)O 中的dir目录下符合Abc*(或Abc*.java或*.java)规则的文件&目录
/dir/Abc*/ 忽略(.gitignore)O 中的dir目录下符合Abc*的目录(不忽略dir下的文件!)
/dir/*/ 忽略(.gitignore)O 中的dir目录下的符合*的子目录(注意/sub/file的文件不会忽略)
/dir/*/*.txt 忽略(.gitignore)O 中的dir目录下的符合*的子目录下的,符合*.txt的文件&目录。注意是一个星,仅忽略一层,即/dir/sub/a.txt 和 /dir/sub/sub2/b.txt,仅仅忽略a.txt,不忽略b.txt,另外/dir/k.txt也不会被忽略
/dir/**/*.txt 忽略 (.gitignore)O 中的dir目录下的直接和间接子目录下的,符合*.txt的文件&目录。两个星号表示0-n层级的目录
/sub/** 和 /sub/ 是等价的 亲测。前者表示忽略/sub/下的所有直接或间接的目录和文件(**表示文件和目录,因为没有/结尾),后者表示忽略/sub/下的东西
/sub/**/ 和 /sub/ 是不等价的 亲测。前者明确表示忽略目录除掉了文件,所以对于/sub/file是不会被忽略的。
sub/ 和 /sub/ 含义不同 前者忽略(.gitignore)N下的sub目录,后者忽略(.gitignore)O下的sub
sub/abc/ 和 /sub/abc/ 这两个的含义完全相同(有点奇怪,本以为前者是递归所有的目录)
**/src/main/java/ 和 src/main/java/ 不等价。前者匹配(.gitignore)N下的src/main/java/ 目录,要满足这个目录的层级结构的。后者等价于/src/main/java/,仅仅忽略(.gitignore)O下的该目录
**/src/main/file.txt 和 src/main/file.txt 不等价。前者匹配(.gitignore)N下的src/main/file.txt,符合这个目录层级结构的将会被忽略,后者等价于/src/main/file.txt,仅仅忽略(.gitignore)O下所匹配的
**/dir/ 和 dir/ 是等价的。上面的例子等价这个不等价,就是因为目录的层级数的问题导致的
**/file.txt 和 file.txt 是等价的。
先后写!a.txt和*.txt 后面的配置覆盖前面的,导致所有*.txt文件都被忽略(有点奇怪,实际测试确实如此)
先后写*.txt 和 !a.txt 正确。能够忽略除了a.txt外的文件。
对于.gitignore文件不在git仓库根目录的情况:参考特殊情况 (参考特殊情况)
  • 特殊情况
# 对于.gitignore文件并非和git仓库根目录相同目录,如下所示,git仓库根目录即.git所在的目录,跟.gitignore目录并非相同
# /sub2       忽略的是sub/sub2,并不是git根目录的那个sub2
# sub2              忽略的也是sub/sub2,也就是说.gitignore的写法只能管该文件所在的目录及其子目录和子子目录...,其父目录管不着

|---.git
|---a.txt
|---sub
|           |----.gitignore
|           |----b.txt
|           |----sub_sub
|           |       |-----c.txt 
|       |----sub2
|                   |-----test.txt      
|---sub2
     |----x.txt
     |----sub2_sub
                        |------y.txt

版权声明:本文为CSDN博主「石头StoneWang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w8y56f/article/details/103263924

参考:
1..gitignore文件语法和常见写法(就看这篇就行了)

独特见解