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
评论 (0)