目录
概述
gitignore —— 指定故意忽略的文件以忽略
描述
gitignore文件指定Git应该忽略的故意未跟踪的文件。 Git已经跟踪的文件不受影响;有关详细信息,请参见注意的笔记。
gitignore文件中的每一行都指定一个模式。在决定是否忽略路径时,Git通常会从多个来源检查gitignore模式,并按照从高到低的优先顺序(从一个优先级来看,最后一个匹配模式决定结果):
- 从命令行读取的模式(对于那些支持模式的命令)。
- 从与路径相同的目录中或任何父目录中的.gitignore文件读取的模式,其中较高级别文件(直到工作树的顶层)中的模式被较低级别文件(直至该目录)中的模式覆盖包含文件。这些模式相对于.gitignore文件的位置匹配。项目通常在其存储库中包含此类.gitignore文件,其中包含作为项目构建一部分而生成的文件的模式。
- 从$GIT_DIR/info/exclude读取的模式。
- 从配置变量core.excludesFile指定的文件中读取模式。
存放模式的文件取决于模式的使用方式:
- 应该由版本控制并通过克隆(即所有开发人员都想忽略的文件)分发到其他存储库的模式应放入.gitignore文件。
- 特定于特定存储库但无需与其他相关存储库共享的模式(例如,位于存储库中但特定于一个用户工作流程的辅助文件)应放入$GIT_DIR/info/exclude文件。
- 用户希望Git在所有情况下都忽略的模式(例如,由用户选择的编辑器生成的备份或临时文件)通常会保存在用户的〜/.gitconfig中由core.excludesFile指定的文件中。其默认值为$XDG_CONFIG_HOME/git/ignore。如果$ XDG_CONFIG_HOME未设置或为空,则使用$HOME/.config/git/ignore。
基本的Git管道工具,例如git ls-files和git read-tree,可读取命令行选项指定的gitignore模式,或从命令行选项指定的文件中读取。更高级别的Git工具(例如git status和git add)使用上述指定来源中的模式。
模式格式
- 空行不匹配任何文件,因此可以用作分隔符以提高可读性。
- 以#开头的行用作注释。对于以哈希开头的模式,请在第一个哈希之前放置反斜杠(“ \”)。
- 除非用反斜杠(“ \”)引号,否则将忽略尾随空格。
- 可选的前缀“!”否定了模式;先前模式排除的所有匹配文件将再次包含在内。如果排除该文件的父目录,则无法重新包含该文件。由于性能原因,Git不会列出被排除的目录,因此包含在文件上的任何模式(无论它们在何处定义)均无效。在第一个“!”前面加上反斜杠(“ \”)。以文字“!”开头的模式,例如“ \! important!.txt”。
- 斜杠/用作目录分隔符。分隔符可以出现在.gitignore搜索模式的开始,中间或结尾。
- 如果在模式的开头或中间(或两者)都存在分隔符,则该模式是相对于特定.gitignore文件本身的目录级别的。否则,模式也可能在.gitignore级别以下的任何级别匹配。
- 如果模式末尾有分隔符,则该模式将仅匹配目录,否则该模式可以同时匹配文件和目录。
- 例如,模式doc/frotz/匹配doc/frotz目录,但不匹配a/doc/frotz目录;但是frotz/匹配目录下的frotz和a/frotz(所有路径都是相对于.gitignore文件的相对路径)。
- 星号“*”匹配除斜杠之外的所有内容。“?”匹配除“/”以外的任何一个字符。范围符号,例如[a-zA-Z]可用于匹配范围中的一个字符。有关更多详细说明,请参见fnmatch(3)和FNM_PATHNAME标志。
与完整路径名匹配的模式中的两个连续星号(“**”)可能具有特殊含义:
- 前导“**”后跟斜杠表示在所有目录中均匹配。例如,“**/foo”与文件“foo”在任何位置都匹配文件或目录“ foo”。 “**/foo/bar”与文件或目录“bar”匹配,直接位于目录“ foo”下。
- 尾部的“/**”匹配内部的所有内容。例如,相对于.gitignore文件的位置,“abc/**”匹配目录“abc”内的所有文件的深度是无限的。
- 斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“a/**/b”匹配“a/b”,“a/x/b”,“a/x/y/b”等。
- 其他连续的星号被视为常规星号,并将根据之前的规则进行匹配。
配置文件
可选的配置变量core.excludesFile指示文件的路径,该路径包含要排除的文件名模式,类似于$GIT_DIR/info/exclude。除了$GIT_DIR/info/exclude中的模式以外,还使用排除文件中的模式。
注意
gitignore文件的目的是确保未被Git跟踪的某些文件保持未跟踪状态。
要停止跟踪当前跟踪的文件,请使用git rm --cached。
示例
模式hello.*匹配名称以hello开头的任何文件或文件夹。如果只想将此限制于目录而不是其子目录,则可以在模式前面加上斜杠,即/hello.*;该模式现在匹配hello.txt,hello.c,但不匹配a/hello.java。
模式foo/将匹配目录foo及其下的路径,但不匹配常规文件或符号链接foo(这与pathspec在Git中的一般工作方式一致)。
模式doc/frotz和/doc/frotz在任何.gitignore文件中具有相同的效果。换句话说,如果模式中已经存在中间斜杠,那么前导斜杠就无关紧要。
模式“foo/*”与“foo/test.json”(常规文件),“foo/bar”(目录)匹配,但与“foo/bar/hello.c”(常规文件)不匹配),因为该模式中的星号与其中带有斜杠的“bar/hello.c”不匹配。