gitignore中文文档
本文翻译自[gitignore[1]][],仅保证对Git 2.2.2以下版本有效。
第一次翻译文档,其中有几处感觉不是特别明确,标出了原文,欢迎讨论。
如果错误也欢迎指出。
名字
gitignore - 指定Git应该忽略不去追踪的文件
摘要
$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore
说明
一个gitignore
文件指定了Git应该忽略不去追踪的文件。但是已经被Git追踪的文件不会受此影响,详情见下面的“注意事项”。
gitignore
文件中没一行指定了一个pattern。在决定是否要忽略一个路径时,Git通常会按优先级检查下面几个地方的gitignore
pattern,列表按优先级从高到低排列(同一优先级后定义的pattern生效):
- 命令行。
- 同目录或父目录(最高至工作树的顶层目录)中的
.gitignore
文件。如有冲突,上级目录中定义的pattern会被包含冲突文件的下级目录定义的取代。这些pattern使用相对于gitignore
所在目录的路径。一般来说,每个项目都会有这样的.gitignore
文件,里面包含一些诸如编译生成的文件。 $GIT_DIR/info/exclude
- 配置变量
core.excludesfile
所指定的文件。
pattern要存放在哪里取决于其意图:
- 如果某些pattern需要被控制版本并且需要通过clone分布到其他仓库(如所有开发者都想忽略的文件),应该写在
.gitignore
文件中。 - 某个仓库特定的、不希望与其他仓库共享的pattern(如某一个开发者开发时产生的临时文件),应写在
$GIT_DIR/info/exclude
文件中。 - 某个用户希望Git无论何时都忽略的pattern(比如用户的编辑器产生的备份或临时文件),应写在
~/.gitconfig
中的core.excludefile
变量指定的文件中,变量默认值为$XDG_CONFIG_HOME/git/ignore
。如果$XDG_CONFIG_HOME
不存在或为空,会使用$HOME/.config/git/ignore
作为替代。
低层的Git工具(The underlying Git plumbing tools),诸如git ls-files和git read-tree,会读取命令行选项所指定的gitignore
pattern,或者从命令行选项指定的文件中读取。高层的Git工具,比如git status和git add,会从上面所说的来源中读取pattern。
Pattern格式
- 空行不匹配任何文件,通常作为分隔符提高可读性
- "
#
"开头的行是注释。如果需要写一个以"#
"开头的pattern,在前面加一个反斜线("\
")。 - 行尾空格会被忽略,除非用反斜线("
\
")引用起来。 - "
!
"表示否定。该条pattern匹配到的文件即使之前被其他pattern排除了,也会重新被包含进来。但是如果一个目录被排除了,那么目录中任何文件都永远不可能被重新包含。出于性能考虑,Git不会列出被排除的目录,所以这些目录内的文件中的pattern不会生效(any patterns on contained files have no effect),不管它们是在哪里定义的。如果pattern需要以"!
"开头,在前面加一个反斜线("\
"),如"\!important!.txt
"。 - 如果pattern以斜线("
/
")结尾,则只会匹配目录。如foo/
会匹配foo
目录以及它下面的路径,而不会匹配名为foo
的文件或符号链接(这是为了保持与Git中一般的路径用法一致)。 - 如果pattern不包含斜线("
/
"),Git会将其认为是一个shell glob pattern(译者:参见glob(7)),并相对于.gitignore
文件的路径查找匹配文件(如果pattern不是在.gitignore
文件中则相对于工作树顶级目录)。 - 否则,Git将其视为fnmatch(3)使用FNM_PATHNAME时所适用的shell glob,即通配符不能匹配"
/
"(译者:参见fnmatch(3))。例如"Documentation/*.html
"可以匹配"Documentation/git.html
"但不能匹配"Documentation/ppc/ppc.html
"或"tools/perf/Documentation/perf.html
"。 - 前导斜线将匹配路径开头。如"
/*.c
"匹配"cat-file.c
",但不能匹配"mozilla-sha1/sha1.c
"。
pattern中的两个连续的星号("**
")可以匹配全部路径名:
- 前导"
**/
"意味着在所有目录中匹配。如"**/foo
"匹配任意位置的"foo
"文件或目录,和pattern "foo
"等同。"**/foo/bar
"匹配任意位置的"foo
"目录下的"bar
"。 - 结尾的"
/**
"匹配目录下的所有文件。比如"abc/**
"匹配"abc
"目录中的所有文件,相对于".gitignore
"文件所在目录,深度无限。 - "
/**/
"匹配0个或多个目录。比如"a/**/b
"匹配"a/b
","a/x/b
","a/x/y/b
"等等。 - 其他"
**
"用法视为非法。
注意事项
gitignore文件的目的在于确保特定文件不被Git追踪。
要忽略已经被追踪但还没有提交(commit)的文件,使用"git update-index {litdd}assume-unchanged
"。
要停止追踪一个文件,使用"git rm --cached
"。
示例
$ git status
[...]
# Untracked files:
[...]
# Documentation/foo.html
# Documentation/gitignore.html
# file.o
# lib.a
# src/internal.o
[...]
$ cat .git/info/exclude
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
# Documentation/foo.html
[...]
另一个例子:
$ cat .gitignore
vmlinux*
$ ls arch/foo/kernel/vm*
arch/foo/kernel/vmlinux.lds.S
$ echo '!/vmlinux*' >arch/foo/kernel/.gitignore
第二个例子阻止了Git忽略"arch/foo/kernel/vmlinux.lds.S
"。
忽略除了"for/bar
"目录之外内容的例子(注意"/*
"——如果没有斜线,通配符也将匹配"for/bar
"下的内容):
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
另见
[git-rm[1]][], [git-update-index[1]][], [gitrepository-layout[5]], [git-check-ignore[1]]
GIT
Part of the [git[1]][] suite
[gitignore[1]]: http://www.git-scm.com/docs/gitignore/2.2.2
[git-rm[1]]: http://www.git-scm.com/docs/git-rm
[git-update-index[1]]: http://www.git-scm.com/docs/git-update-index
[gitrepository-layout[5]]: http://www.git-scm.com/docs/gitrepository-layout
[git-check-ignore[1]]: http://www.git-scm.com/docs/git-check-ignore
[git[1]]: http://www.git-scm.com/docs/git