我们经常会在Github上面一些大型开源项目的代码中见到.gitignore这文件。那它是干什么的呢?

我们知道git版本控制的目录下都有一个隐藏文件夹.git(类UNIX系统中,.开头的文件或文件夹都默认是隐藏的,Linux下可使用ctrl+h快捷键显示隐藏文件,其他系统没用过),这个文件夹记录了有版本控制的文件。而且,还没有加入版本控制的文件会显示为“Untracked”。然后我们需要使用git add命令把这些未纳入版本控制的文件加到版本库里面,并后续git commit; git push。比如我下面的extra文件就还没有纳入到版本库中:

➜  extra git:(master) ✗ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    extra

nothing added to commit but untracked files present (use "git add" to track)

但是有的时候我们有些文件就是只需要在本地,而不需要纳入到版本控制中。我平时有几个特别典型的这种场景:

  • IDE自己产生的一些配置文件不需要纳入到代码库中。比如IDEA产生的.idea文件夹、.iml文件等。
  • 一些编译链接产生的临时文件。比如编译C代码产生的.o、.a文件不需要纳入到版本库。
  • 一些软件自动产生的临时文件。比如vim、Emacs等产生的临时文件,office系列软件产生的临时文件等,这些文件大多以~开头。
  • 一些本地自己的测试文件。

虽然,你可以在每次提交代码时稍微注意一些,不提交这些文件,但难免有不小心的时候。所以git提供了.gitignore文件,写在这个文件里面的东西git会过滤掉,不纳入版本管理。这个文件支持POSIX基本的正则表达式(如果你对BRE不熟悉,可参见我之前的博客《Linux正则表达式》),而且它还满足以下规则:

  • 所有空行或者以#开头的行都会被git忽略,即#是注释行。
  • 匹配模式可以以/开头防止递归。
  • 匹配模式可以以/结尾指定目录。
  • 要忽略指定模式以外的文件或者目录,可以在模式前加上!取反。

下面我们看个例子:

# 忽略掉所有.o、.a文件
*.[ao]

#  忽略掉所有~开头和结尾的文件
*~
~*

# 把 lib.a纳入到版本管理,即使之前已经忽略了所有.a文件
!lib.a

# 只忽略当前目录下的TODO文件
/TODO

# 忽略build目录下的所有文件
build/

# 忽略doc目录下所有.txt结尾的文件
doc/*.txt

有了这个文件后,你会发现你输入git status之后,凡是符合上述过滤条件的文件都不会再显示为“Untracked”状态了。如果你在为这个语法苦恼,那恭喜你:

https://github.com/github/gitignore

这个地方集结了各种场景的.gitignore文件,你可以直接拿过来用,你也可以稍微私人订制一下。比如提供的JetBrains系列IDE的.gitignore文件为:

# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff:
.idea/workspace.xml
.idea/tasks.xml

# Sensitive or high-churn files:
.idea/dataSources/
.idea/dataSources.ids
.idea/dataSources.xml
.idea/dataSources.local.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml

# Gradle:
.idea/gradle.xml
.idea/libraries

# Mongo Explorer plugin:
.idea/mongoSettings.xml

## File-based project format:
*.iws

## Plugin-specific files:

# IntelliJ
/out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

而且这个设计在其他地方也可能会遇到,比如docker提供了.dockerignore文件和Dockerfile配合使用,作用与.gitignore相同。

祝使用愉快。