Git
英语 ▾ 主题 ▾ 最新版本 ▾ gitignore 最后更新于 2.42.0

名称

gitignore - 指定有意要忽略的未跟踪文件

概要

$XDG_CONFIG_HOME/git/ignore, $GIT_DIR/info/exclude, .gitignore

描述

gitignore 文件指定 Git 应该忽略的有意未跟踪文件。Git 已经跟踪的文件不受影响;有关详细信息,请参见下面的说明。

gitignore 文件中的每一行都指定一个模式。在决定是否忽略路径时,Git 通常会检查来自多个来源的 gitignore 模式,其优先级顺序如下,从最高到最低(在一个优先级级别内,最后一个匹配的模式决定结果)

  • 从命令行读取的模式,适用于支持它们的命令。

  • 从与路径相同目录中的 .gitignore 文件读取的模式,或任何父目录(一直到工作树的顶层),更高级别文件中的模式会被更低级别文件中的模式覆盖,直到包含该文件的目录为止。这些模式相对于 .gitignore 文件的位置进行匹配。项目通常在其存储库中包含此类 .gitignore 文件,其中包含为项目构建过程中生成的文件生成的模式。

  • $GIT_DIR/info/exclude 读取的模式。

  • 从配置变量 core.excludesFile 指定的文件中读取的模式。

将模式放置在哪个文件中取决于模式的使用目的。

  • 应进行版本控制并通过克隆分发到其他存储库的模式(即所有开发人员都希望忽略的文件)应放置在 .gitignore 文件中。

  • 特定于某个存储库但不需要与其他相关存储库共享的模式(例如,存在于存储库中但特定于某个用户工作流程的辅助文件)应放置在 $GIT_DIR/info/exclude 文件中。

  • 用户希望 Git 在所有情况下都忽略的模式(例如,用户选择的编辑器生成的备份文件或临时文件)通常放置在用户 ~/.gitconfigcore.excludesFile 指定的文件中。其默认值为 $XDG_CONFIG_HOME/git/ignore。如果 $XDG_CONFIG_HOME 未设置或为空,则使用 $HOME/.config/git/ignore。

底层的 Git 管道工具(如 git ls-filesgit read-tree)会读取由命令行选项指定的 gitignore 模式,或从命令行选项指定的文件读取的模式。更高级别的 Git 工具(如 git statusgit add)使用来自上述来源的模式。

模式格式

  • 空行不匹配任何文件,因此可以作为分隔符以提高可读性。

  • 以 # 开头的行用作注释。在第一个井号前面加上反斜杠 ("\"),以匹配以井号开头的模式。

  • 尾随空格会被忽略,除非它们是用反斜杠 ("\") 引用。

  • 可选前缀 "!" 用于否定模式;任何与先前模式排除的匹配文件将再次包含进来。如果文件的父目录被排除,则无法重新包含该文件。出于性能方面的考虑,Git 不会列出排除的目录,因此对包含文件的所有模式都没有效,无论它们在何处定义。

  • 斜杠 "/" 用作目录分隔符。分隔符可以出现在 .gitignore 搜索模式的开头、中间或结尾。

  • 如果模式的开头或中间(或两者)存在分隔符,则模式相对于特定 .gitignore 文件本身的目录级别。否则,模式也可以匹配 .gitignore 级别以下的任何级别。

  • 如果模式末尾存在分隔符,则该模式仅匹配目录;否则,该模式可以匹配文件和目录。

  • 例如,模式 doc/frotz/ 匹配 doc/frotz 目录,但不匹配 a/doc/frotz 目录;然而 frotz/ 匹配 frotza/frotz,它们是目录(所有路径都是相对于 .gitignore 文件的)。

  • 星号 "*" 匹配除斜杠以外的任何字符。字符 "?" 匹配除 "/" 以外的任何单个字符。范围表示法(例如 [a-zA-Z])可用于匹配范围内的某个字符。有关更详细的描述,请参阅 fnmatch(3) 和 FNM_PATHNAME 标志。

在与完整路径名匹配的模式中,两个连续的星号 ("**") 可能具有特殊含义

  • 以 "**" 开头,后跟斜杠,表示匹配所有目录。例如,"**/foo" 匹配任何位置的文件或目录 "foo",与模式 "foo" 相同。"**/foo/bar" 匹配直接位于 "foo" 目录下的任何位置的文件或目录 "bar"。

  • 以 "/**" 结尾,表示匹配内部的所有内容。例如,"abc/**" 匹配 "abc" 目录内的所有文件,相对于 .gitignore 文件的位置,深度无限。

  • 斜杠后跟两个连续的星号,再跟一个斜杠,表示匹配零个或多个目录。例如,"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 从索引中删除该文件。然后可以将文件名添加到 .gitignore 文件中,以阻止该文件在以后的提交中重新引入。

Git 在访问工作树中的 .gitignore 文件时不会遵循符号链接。这使行为在从索引或树中访问文件时与从文件系统中访问文件保持一致。

示例

  • 模式 hello.* 匹配任何名称以 hello. 开头的文件或目录。如果想将其限制在目录中,而不是在它的子目录中,可以在模式前面加上斜杠,即 /hello.*;该模式现在匹配 hello.txthello.c,但不匹配 a/hello.java

  • 模式 foo/ 将匹配目录 foo 及其下面的路径,但不匹配普通文件或符号链接 foo(这与 Git 中路径规范的一般工作方式一致)

  • 模式 doc/frotz/doc/frotz 在任何 .gitignore 文件中具有相同的效果。换句话说,如果模式中已经存在中间斜杠,则前导斜杠无关紧要。

  • 模式 foo/* 匹配 foo/test.json(普通文件)、foo/bar(目录),但不匹配 foo/bar/hello.c(普通文件),因为模式中的星号不匹配 bar/hello.c,其中包含斜杠。

    $ 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

第二个 .gitignore 阻止 Git 忽略 arch/foo/kernel/vmlinux.lds.S

例如,要排除除特定目录 foo/bar 之外的所有内容(请注意 /* - 如果没有斜杠,通配符也会排除 foo/bar 内的所有内容)

    $ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Git

git[1] 套件的一部分

scroll-to-top