directory search
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore git commit-tree git count-objects git diff-index git for-each-ref git hash-object git ls-files git merge-base git read-tree git rev-list git rev-parse git show-ref git symbolic-ref git update-index git update-ref git verify-pack git write-tree Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
characters

名称

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

概要

$HOME/.config/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 在所有情况下都忽略的模式(例如,由用户选择的编辑器生成的备份或临时文件)通常会进入core.excludesFile用户指定的文件~/.gitconfig。它的默认值是 $ XDG_CONFIG_HOME / git / ignore。如果 $ XDG_CONFIG_HOME 未设置或为空,则使用 $ HOME / .config / git / ignore。底层 Git 管道工具(例如git ls-filesgit read-tree)读取gitignore由命令行选项指定的模式或从命令行指定的文件选项。更高级的 Git 工具,比如git statusgit add,使用来自上面指定源的模式。模式格式

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

  • 以 # 开始的行作为评论。将\第一个散列前面的反斜杠(“ ”)放在以散列开头的模式中。

  • 尾部空格被忽略,除非用反斜杠(“\”)引用。

  • 可选的前缀“!”,否定模式; 任何先前模式排除的匹配文件将再次包含在内。如果排除该文件的父目录,则不可能重新包含文件。由于性能原因,Git 没有列出排除的目录,因此无论它们被定义在何处,包含文件的任何模式都不起作用。将反斜杠(“\”)放在第一个“!”之前,以“!” 开头的模式,例如“\!important!.txt”。

  • 如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会与目录找到匹配项。换句话说,foo/它将匹配一个目录foo和它下面的路径,但不匹配一个常规文件或符号链接foo(这与在Git中通常如何工作的方式一致)。

  • 如果模式不包含斜线/,则Git将其视为 shell glob 模式,并检查与.gitignore文件位置相关的路径名的匹配(相对于工作树的顶层,如果不是来自.gitignore文件)。

  • 否则,Git 将该模式视为适合 fnmatch(3)使用 FNM_PATHNAME 标志使用的 shell glob:模式中的通配符不会与路径名中的/匹配。例如,“Documentation / *。html” 与 “Documentation / git.html” 匹配,但不匹配 “Documentation / ppc / ppc.html” 或 “tools / perf / Documentation / perf.html”。

  • 前导斜杠匹配路径名的开头。例如,“/*.c” 与 “cat-file.c” 匹配,但不匹配 “mozilla-sha1 / sha1.c”**。匹配完整路径名的模式中的两个连续星号(“ ”)可能有特殊含义:

  • 前面的“**”后跟斜杠意味着所有目录匹配。例如,“**/foofoo在任何地方与文件或目录“ ”匹配,与模式“foo” 相同。“**/foo/bar”与bar直接在目录“foo” 下的任何地方的文件或目录“ ”匹配。

  • 尾随 “/**” 匹配内部的所有内容。例如,“abc/**” 匹配目录 “abc” 内的所有文件,相对于.gitignore文件的位置,具有无限深度。

  • 斜杠后跟两个连续的星号,则斜线匹配零个或多个目录。例如,“a/**/b” 匹配“a/b”,“a/x/b”,“a/x/y/b” 等。

  • 其他连续的星号被认为是无效的。

笔记

gitignore 文件的目的是确保未被 Git 跟踪的某些文件保持未被跟踪。

要停止跟踪当前跟踪的文件,请使用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

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

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

$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
Previous article: Next article: