.gitignore配置语法


简介

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

规则

  • 空行不匹配任何文件,所以可以用空行来增强gitignore规则的可读性
  • 注释行以#开头。可以在#前加一个反斜杠转义之,使之能够匹配包含#字符的文件夹或文件
  • 如果每一行最后尾随的空格没有用反斜杠转义,那么这些空格是无效的,不会作为规则的一部分
  • 使用!前缀来否定之前的规则。如果一个文件被前面的gitignore规则给匹配到了,那么该文件不会被Git追踪,但是如果后面的规则使用!匹配到了该文件,那么该文件又会被Git追踪。当然,如果一个文件的父目录都被Git忽略了,那么无论如何,这个文件都不会被Git追踪。出于性能考虑,Git不会遍历被忽略的目录,因此,定义在被忽略目录下的gitignore规则都是无效的。有时候,我们真的是想忽略以感叹号!开头的一个文件或者目录,这时,可以在感叹号!前面加一个反斜杠转义之,比如:\!important.txt会匹配文件!important.txt
  • 如果一个规则以斜杠结尾,在实际匹配的时候,最后的斜杠会被移除掉,但是这个规则只会匹配目录,而不会匹配文件。换句话说,foo/会匹配到目录foofoo下的子目录,但不会匹配到文件foo或者软链接foo
  • 如果规则中不包含斜杠/,Git就会就会把该规则当成通配符规则来进行处理,从该规则所在.gitignore文件所在路径开始匹配。当然,如果这个规则不是放在.gitignore文件中的,就会从work tree的顶部开始匹配
  • 如果规则不符合以上的情况,那么Git就会把这个规则当成shell通配符规则来进行解析,是以带FNM_PATHNAME标记的fnmatch(3)规则进行解析。但是,规则中的通配符不会匹配路径名中的斜杠/。举个栗子,Documentation/*.html匹配Documentation/git.html,但不会匹配Documentation/ppc/ppc.html或者tools/perf/Documentation/perf.html
  • 以斜杠开头的通配符规则从路径开头开始匹配。比如,/*.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/ba/x/ba/x/y/b这些
  • 其他形式的连续星号都认为是非法的

规则总结

  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反
  • 星号(*)匹配零个或多个任意字符
  • [abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
  • 问号(?)只匹配一个任意字符
  • 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
  • 使用两个星号() 表示匹配任意中间目录**,比如a//z可以匹配 a/z, a/b/z 或 a/b/c/z等。

常用规则:

/mtk/              
#过滤整个mtk文件夹
*.zip               
#过滤所有.zip文件
/mtk/do.c        
#过滤/mtk/do.c文件

fd1/*      
#忽略目录 fd1 下的全部内容

/fd1/*    
#忽略根目录下的 /fd1/ 目录的全部内容;

!/fw/bin/
!/fw/sf/             
#不忽略 根目录下的 /fw/bin/ 和 /fw/sf/ 目录;

gitignore文件添加

Git在添加.gitignore之前就push了项目

(为避免冲突可以先同步下远程仓库 git pull

// 在本地项目目录下删除暂存区内容: 
git rm -r --cached .

// 新建.gitignore文件,并添加过滤规则(用文本编辑器如Notepad++)

// 再次`add`文件,添加到暂存区
git add .

// 再次`commit`提交文件
git commit -m “add .gitignore”

// 最后`push`即可
git push

Git push完文件后想要修改过滤规则使其生效

// 修改完.gitignore 在本地项目目录下
git rm -r --cached .
git add .
git commit -m".gitignore update"

参考:link0 link1 link2 link3


文章作者: DearDeer
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DearDeer !
评论
  目录