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-filesgit read-tree,会读取命令行选项所指定的gitignore pattern,或者从命令行选项指定的文件中读取。高层的Git工具,比如git statusgit 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

posted on 2015-01-24 21:21  etflly  阅读(766)  评论(0编辑  收藏  举报

导航