简介
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
规则
- 空行不匹配任何文件,所以可以用空行来增强
gitignore规则的可读性 - 注释行以
#开头。可以在#前加一个反斜杠转义之,使之能够匹配包含#字符的文件夹或文件 - 如果每一行最后尾随的空格没有用反斜杠转义,那么这些空格是无效的,不会作为规则的一部分
- 使用
!前缀来否定之前的规则。如果一个文件被前面的gitignore规则给匹配到了,那么该文件不会被Git追踪,但是如果后面的规则使用!匹配到了该文件,那么该文件又会被Git追踪。当然,如果一个文件的父目录都被Git忽略了,那么无论如何,这个文件都不会被Git追踪。出于性能考虑,Git不会遍历被忽略的目录,因此,定义在被忽略目录下的gitignore规则都是无效的。有时候,我们真的是想忽略以感叹号!开头的一个文件或者目录,这时,可以在感叹号!前面加一个反斜杠转义之,比如:\!important.txt会匹配文件!important.txt - 如果一个规则以斜杠结尾,在实际匹配的时候,最后的斜杠会被移除掉,但是这个规则只会匹配目录,而不会匹配文件。换句话说,
foo/会匹配到目录foo和foo下的子目录,但不会匹配到文件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/b、a/x/b、a/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"