简介

        本文介绍git的.gitignore忽略文件的用法。

        项目中并不是所有文件都需要保存到版本库中的,例如“target”目录及目录下的文件就可以忽略。

        忽略某个文件(不提交到版本库的方法):在Git工作区的根目录下创建一个.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件或目录。

建议忽略的文件

如下文件建议忽略(不上传到版本仓库):

  1. 操作系统自动生成的文件,比如缩略图等
  2. 编译生成的中间文件,可执行文件等。
  3. 自己的带有敏感信息的配置文件,比如存放口令的配置文件

优先级

Git有多个地方可以配置忽略规则,它的优先级如下(由高到低):

  1. 命令行中的忽略规则,从上往下依次读取
  2. 当前目录定义的规则(当前目录的.gitignore文件)
  3. 父级目录定义的规则(父目录的.gitignore文件)
  4. $GIT_DIR/info/exclude 文件中定义的规则
  5. core.excludesfile中定义的全局规则

Java项目的.gitignore示例

# Compiled class file
*.class

# Eclipse
.project
.classpath
.settings/

# Intellij
*.ipr
*.iml
*.iws
.idea/

# Maven
target/

# Gradle
build
.gradle

# Log file
*.log
log/

# out
**/out/

.gitignore匹配语法

采用的匹配规则是:globs。

  • 空格不匹配任意文件,可作为分隔符,可用反斜杠转义
  • 开头的文件标识注释,可以使用反斜杠进行转义
  • ! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
  • / 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
  • / 开始的模式匹配项目跟目录
  • 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
  • ** 匹配多级目录,可在开始,中间,结束
  • ? 匹配单个字符
  • * 匹配零个或多个字符
  • [] 匹配单个字符列表

.gitignore不生效

        .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

解决方法:

git rm -r --cached .
git add .
git commit -m .gitignore
git push origin master

检查.gitignore规则

        如果发现.gitignore有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:

$ git check-ignore -v HelloWorld.class
.gitignore:1:*.class HelloWorld.class

可以看到HelloWorld.class匹配到了我们的第一条*.class的忽略规则所以文件被忽略了。