背景
在使用 git 的时候,会遇到必须把某些文件放到 Git 工作目录中,但又不能提交它们的场景,比如说,保存了数据库密码的配置文件或者编译过程中生成的中间文件等等,每次 git status 都会显示 Untracked files ... ,有强迫症的童鞋心里肯定不爽。
不过 git 也考虑了使用者的感受,故在 git 工作区的根目录下创建一个特殊的 .gitignore 文件,然后把要忽略的文件名填进去,git 就会自动忽略这些文件。
忽略文件的一般原则如下:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如 Java 编译产生的 .class 文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
.gitignore的语法
语法规则很简单,与正则表达式类似,详情可以查看官网的介绍。以下列出常用的一些规则:
- 空格 不匹配任意文件。
- * 匹配任意文件
#忽略 a 目录下的所有文件 a/*
- # 标识注释,可以使用反斜杠进行转义。
#注释 test 文件 #test
- /* 匹配项目跟目录。
#忽略根目录下的所有文件 /
- */ 只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件。
#忽略根目录下的 test/ 目录下的所有文件 test/
- ! 标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义。
#不忽略 test 目录下的 excep.txt 文件 !test/except.txt
- ? 通用匹配单个字符。
#忽略根目录下的 testa.txt、testb.txt 文件 test?.txt
- [] 通用匹配单个字符列表.
#忽略根目录下的 testk.txt、testl.txt 文件 test[k,l].txt
- ** 匹配多级目录,可在开始,中间,结束。
#忽略根目录下的a/b/c/test、fd/gg/test目录 **/test
.gitignore 的使用
- 在 git 项目中创建 .gitignore 文件
首先,在我们下载一个 git 项目的时候,是没有 .gitignore 文件的,需要我们自己手动创建,然后再按照上述的匹配规则,定义当前项目的提交规则。
.gitignore 文件是可以提交到云端仓库中的,这就为该项目下的所有开发者都共享一套定义好的忽略规则。 - 定义 git 全局的 .gitignore 文件
定义全局的忽略规则,可以通过修改 config 来实现。请注意,该规则是用来管理本地所有的 git 项目的,非指定项目,故该文件不能上传到云端仓库中。使用方法如下:
#.gitignore可以放在任意位置,此处以用户根目录为例
git config --global core.excludesfile ~/.gitignore
.gitignore 规则不生效
gitignore 文件只能忽略那些原来没有被 track 的文件,即没有被版本管理中的文件。如果在使用规则前,已经将该文件上传至版本库中,则修改 .gitignore 无效。
解决方法就是清除本地缓存,然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'