忽略文件
约 946 字大约 3 分钟
如果有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如:日志文件,或者编译过程中创建的临时文件等。在这种情况下,可以创建一个名为 .gitignore
的文件,列出要忽略的文件的模式。例如:
cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o
或 .a
结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的;第二行告诉 Git 忽略所有名字以波浪符(~
)结尾的文件,许多文本编辑软件(比如:Emacs)都用这样的文件名保存副本。
养成一开始就为新仓库设置好 .gitignore
文件的习惯,以免将来误提交这类无用的文件。
提示
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表 示例。
格式规范
.gitignore
文件的格式规范如下:
- 所有空行或者以
#
开头的行都会被 Git 忽略 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
- 匹配模式可以以(
/
)开头防止递归 - 匹配模式可以以(
/
)结尾指定目录 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反
glob 模式
glob 模式是指 shell 所使用的简化了的正则表达式。
- 星号(
*
)匹配零个或多个任意字符 [abc]
匹配任何一个列在方括号中的字符(这个例子要么匹配一个a
,要么匹配一个b
,要么匹配一个c
)- 问号(
?
)只匹配一个任意字符 - 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如:
[0-9]
表示匹配所有0
到9
的数字) - 使用两个星号(
**
)表示匹配任意中间目录,比如:a/**/z
可以匹配a/z
、a/b/z
或a/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