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

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 .gitignore文件语法和常见写法(就看这篇就行了),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

1. 语法

  • 空行会被忽略
  • 匹配是区分大小写的,如:/abc 和 /Abc 含义不同
  • # 开头是注释,会被忽略
  • * 表示0-n个字符
  • ** 两个星含义是子目录子子目录等多层匹配
  • ? 匹配1个字符(注意不是0-1个字符!)
  • [] 用来匹配括号内的任一字符,如 [abc],也可以在括号内加连接符,如 [0-9] 匹配0至9的数
  • *~ 忽略所有以~结尾的文件(这种文件通常被许多编辑器标记为临时文件)
  • *.[oa] 忽略所有以”.o”或”.a”结尾
  • ! 表示不忽略某文件(为什么要特别指出不忽略? 不写规则不就不会被忽略吗?,这是配合使用的,比如要忽略*.log,但是要排除a.log,这种需求就需要使用!)
  • 匹配规则前面别留空格,会让规则失效。如 一个空格Ab?.txtAb?.txt 是有区别的

注意:

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

2. 例子

2.1 前提约定

2.1.1 约定1

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

例如:

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

该表述的含义是:以/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.txtsrc/main/file.txt 不等价。前者匹配(.gitignore)N下的src/main/file.txt,符合这个目录层级结构的将会被忽略,后者等价于/src/main/file.txt,仅仅忽略(.gitignore)O下所匹配的
**/dir/dir/ 是等价的。上面的例子等价这个不等价,就是因为目录的层级数的问题导致的
**/file.txtfile.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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135307.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!