一、背景
在使用Maven进行依赖管理的项目中,有用的文件基本上就是src目录和pom.xml文件。当我们在使用Eclipse、Intellij Idea或其他的IDE导入Maven项目后,都会在项目的根目录下生成和IDE相关的配置文件,有些文件可能还依赖当前的计算机。因为这些配置文件对项目无关紧要,只对当前的电脑和IDE有效。这些文件如果上传到代码仓库,其他伙伴pull代码后在另外一台电脑上运行时可能出现各种错误。因此,我们在版本控制中要忽略这类配置文件。
在git中忽略配置文件很简单,在项目的顶层目录或具体某个目录中添加一个名为“.gitignore”的文件即可。
在Windows系统下,仅有文件扩展名而无文件名字时,无法创建成功。这种情况下有两种创建方式。
方式一: 打开“CMD”或者“Git Bash”,输入下面的命令:
$ echo ''>.gitignore
方式二:
创建一个文件,文件名为:“.gitignore.”,注意前后都有一个点。保存之后系统会自动重命名为“.gitignore”。
二、.gitignore 的格式规范如下:
- 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
- 可以使用标准的glob模式匹配。所谓glob模式是指shell所使用的简化了的正则表达式,详见:glob 模式
- 匹配模式可以以(/)结尾,说明要忽略的是目录。
- 匹配模式可以以(/)开头,防止递归。(此时路径是相对于该项目的根目录而言)
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
例如:
- gng/ :包含gng/的目录都包含在内,如src/demo/gng会被侧地忽略
- /gng/ :过滤整个文件夹,这个路径是相对于该项目的根目录而言的
- *.zip :过滤所有.zip文件
- /gng/do.c :过滤某个具体文件
- *.[oa]和!test.a:表明忽略除test.a文件以外的后缀名为.a或者.o的文件
三、.gitignore文件通用模板
除了知道这些基本的规则之外,还需要设置一些通用的模板,帮助我们快速的开发。在GitHub上有一个十分详细的针对数十种项目及语言的.gitignore文件列表。地址链接
# Eclipse
.classpath
.project
.settings/
# Intellij
.idea/
*.iml
*.iws
*.ipr
/out/
# Mac
.DS_Store
# Maven
log/
target/
build/
# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
# Log file
*.log
# Java
*.class
*-api/target/
*-api-impl/target/
*-data/target/
*-common/target/
*-service/target/
*-rpc/target/
exitStatus*
# svn
.svn/
# Other
*.versionsBackup
tmp
temp
/.idea/
/bin/
四、定义Git全局的 .gitignore 文件
除了可以在项目中定义 .gitignore 文件外,还可以设置全局的 git .gitignore 文件来管理所有Git项目的行为。这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。
这种方式也需要创建相应的 .gitignore 文件,可以放在任意位置。然后在使用以下命令配置Git:
git config --global core.excludesfile ~/.gitignore
五、创建.gitignore文件要趁早
如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理——.gitignore文件中的过滤规则只能影响那些当前还未交由Git来管理的文件。若一个文件已经被现有版本包含了,那么git status
命令依然会显示该文件上的所有修改,并可以通过git add
命令被注册到下一次提交中。
简单来说,出现这种问题的原因是Git已经开始管理这些文件了,所以无法再通过过滤规则过滤它们。因此一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,就需要忽略已被版本化的文件,这种情况的处理更复杂。 若想忽略一个已经被版本化的文件,可以通过update-index
命令的--assume-unchanged
选项来做到这一点。详见:GIT用git update-index命令忽略已经在版本控制并已提交过的文件