跳至主要內容

忽略文件

Sankgao约 946 字大约 3 分钟DevOpsGit

如果有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如:日志文件,或者编译过程中创建的临时文件等。在这种情况下,可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。例如:

cat .gitignore

*.[oa]
*~

第一行告诉 Git 忽略所有以 .o.a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的;第二行告诉 Git 忽略所有名字以波浪符(~)结尾的文件,许多文本编辑软件(比如:Emacs)都用这样的文件名保存副本。

养成一开始就为新仓库设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

提示

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表open in new window 示例。

格式规范

.gitignore 文件的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略
  • 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
  • 匹配模式可以以(/)开头防止递归
  • 匹配模式可以以(/)结尾指定目录
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反

glob 模式

glob 模式是指 shell 所使用的简化了的正则表达式。

  • 星号(*)匹配零个或多个任意字符
  • [abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c
  • 问号(?)只匹配一个任意字符
  • 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如:[0-9] 表示匹配所有 09 的数字)
  • 使用两个星号(**)表示匹配任意中间目录,比如:a/**/z 可以匹配 a/za/b/za/b/c/z 等。

例如:

cat .gitignore

# 忽略所有以 .a 结尾的文件
*.a

# 但跟踪所有的 lib.a,即便您在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略子目录中的 TODO 文件。例如:subdir/TODO
/TODO

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

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

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

共享式和独享式忽略文件

忽略文件 .gitignore共享式独享式。

共享式

.gitignore 被添加到版本库后成为了版本库的一部分,当版本库共享给他人(克隆),或者把版本库推送(push)到集中式的服务器(或他人的版本库)时,这个忽略文件就会出现在他人的工作区中,文件忽略在他人的工作区中同样生效。

独享式

独享式忽略就是不会因为版本库共享,或者版本库之间的推送传递给他人的文件忽略。

独享式忽略有两种方式:

  • 一种是针对 具体版本库 的独享式忽略。即在版本库 .git 目录下的一个文件 .git/info/exclude 来设置文件忽略
  • 另外一种是 全局 的独享式忽略。即通过 Git 的配置变量 core.excludesfile 指定的一个忽略文件,其设置的忽略对所有本地版本库均有效

例如:本地设置一个全局的独享文件忽略列表(这个文件名可以随意设置)。

git config --global core.excludesfile /home/sankgao/.gitignore
git config core.excludesfile

/home/sankgao/.gitignore