4. 忽略文件.gitignore

在项目开发过程中,有些文件是项目测试时自动生成的文件,这些文件没有必要加入到仓库中进行版本控制。如:日志文件等。在这种情况下,你可以在工作区根文件夹下创建一个名为 .gitignore 的文件,此文件的内容可以列出匹配模式的文件,与这些模式匹配的文件默认不会被纳入版本控制。即使用 git add * 等命令也会忽略这些匹配的文件。

如:.gitignore 文件的内容如下:

*.[oa]
*.obj

上述文件第一行告诉 Git 忽略任何以 .o.a 结尾的文件。第二行告诉 Git 忽略所有文件名以 .obj 结尾的文件。

在创建一个新的 Git 仓库时,设置一个 .gitignore 文件通常是个好办法,这样你就不会意外提交你确实不想纳入 Git 仓库的文件。

你可以放入 .gitignore 文件的模式规则如下:

  1. 空行或以 # 开头的行会被忽略。这是 .gitignore 文件的注释。
  2. 标准的 glob 模式有效,并且会在整个工作树中递归应用。
  3. 你可以以正斜杠(/)开头模式以避免递归。
  4. 你可以以正斜杠(/)结尾模式来指定一个文件夹。
  5. 你可以通过在模式前加上感叹号(!)来取反该模式。

Glob 模式类似于 shell 使用的简化正则表达式。星号(*)匹配零个或多个字符;[abc] 匹配括号内的任何字符(本例中是 abc);问号(?)匹配单个字符;用连字符分隔字符并用括号括起来([0-9])匹配它们之间的任何字符(本例中是 09)。你也可以使用两个星号来匹配嵌套文件夹;a/**/z 将匹配 a/za/b/za/b/c/z 等等。

以下是一个 .gitignore 文件的例子:

# 忽略所有 .a 文件
*.a

# 但是跟踪 lib.a,即使你上面忽略了 .a 文件
!lib.a

# 只忽略当前文件夹下的 TODO 文件,而不是 subdir/TODO
/TODO

# 忽略所有名为 build 的文件夹下的所有文件
build/

# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 文件夹及其任何子文件夹中的所有 .pdf 文件
doc/**/*.pdf

提示

GitHub 维护了一个相当全面的 .gitignore 文件示例列表,适用于数十个项目和语言,地址是:https://github.com/github/gitignore,如果你想为你的项目设置一个方便的提交方式,可以参照这个文件的写法。

注意

在通常情况下,仓库可能在根文件夹中有一个 .gitignore 文件,它递归地应用于整个仓库。然而,也可以在子文件夹中拥有额外的 .gitignore 文件。这些嵌套的 .gitignore 文件中的规则仅适用于它们所在文件夹下的文件。Linux 内核源代码仓库就有 206 个 .gitignore 文件。

深入探讨多个 .gitignore 文件的细节详情请参阅手册 man gitignore