「Git」- .gitignore,忽略文件,控制需要提交的文件

  CREATED BY JENKINSBOT

问题描述

gitignore,指定有意的未跟踪的文件,并忽略;

通过 .gitignore 文件,我们能够通过那些哪些文件需要提交,哪些文件应该被忽略;

该笔记将记录:在 Git 中,如何使用 .gitignore 文件,以及常见问题的解决方法;

文件概要(SYNOPSIS)

$HOME/.config/git/ignore
$GIT_DIR/info/exclude
.gitignore

描述(DESCRIPTION)

在 gitignore 文件中,指定了有意未跟踪的、需要 Git 忽略的文件。已经追踪的文件不受影响。参见下面的 NOTES 部分;

在 gitignore 文件中,每一行都指定一个 Pattern。在决定是否忽略某个路径时,Git 通常会从多个地方读取 gitignore 文件,按照以下从最高到最低的顺序读取(在一个优先级中,最后一个 Pattern 决定结果):

  • 对于支持它们的那些命令,可以从命令行读取 Pattern;
  • 从同级目录(或者父级目录)中的.gitignore 文件中读取的 Pattern 及任何父目录中读取的 Pattern(工作树的最顶层,即项目的根目录),会一起被下层文件中的.gitignore 文件覆盖,直到到包含.gitignore 文件的目录。这些 Pattern 相对于.gitignore 文件的位置开始匹配。一个项目通常会在其存储库中包含.gitignore 文件,其中包含作为项目构建一部分生成的文件的 Pattern;
  • $GIT_DIR/info/exclude.
  • 由配置变量 core.excludesFile 指定的 Pattern 读取文件;

放置 Pattern 的文件取决于 Pattern 的使用方式;

不应该版本控制和通过克隆分发到其他存储库的 Pattern,应该进入.gitignore 文件;

某个存储库特定的,而且不需要与其他相关存储库共享的 Pattern(例如,存储在存储库中,但是特定于一个用户工作流程的辅助文件)应该进入$GIT_DIR/info/exclude 文件;

用户希望 Git 在所有情况下忽略的 Pattern(例如,由编辑器生成的备份或临时文件)通常会转到由用户的~/.gitconfig 中的 core.excludesFile 指定的文件中。其默认值为$ XDG_CONFIG_HOME/git/ignore。如果$ XDG_CONFIG_HOME 未设置或为空,则使用$ HOME/.config/git/ignore;

底层的 Git 管道工具(如 git ls-files 和 git read-tree)读取由命令行选项指定的 gitignore Pattern,或从命令行选项指定的 gitignore 文件。更高级的 Git 工具,例如 git status 和 git add,使用上面指出的源的 Partern;

「PATTERN」的格式(PATTERN FORMAT)

空白行什么都不匹配;

井号(#)开始的行表示注释。如果要以井号(#)开始行可以使用反斜线(\)进行转义;

尾随的空格将会被忽略,除非使用反斜线转义;

可选前缀“!”用于消除 pattern;任何由先前模式排除的匹配文件将被再次包含。如果该文件的父目录被排除,则不可能重新包含文件;
出于性能原因,Git 不会列出排除的目录,因此,包含文件的任何模式都无效,无论它们在哪里定义;
如果要使用“!”作为文件的开头,可以使用反斜线进行转义;

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

如果 Partern 不包含斜杠 /,Git 将其视为 shell glob 模式,并根据.gitignore 文件的位置检查与路径名的匹配(相对于工作树的 toplevel,如果不是从.gitignore 文件);

另一方面,Git 将 Partern 视为适合通过 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”;

以****后跟斜杠(/)表示在所有目录中匹配。例如,“/foo”匹配所有的“foo”文件或目录,与模式“foo”相同。“**/foo/bar”匹配直接位于 foo 目录下的“bar”文件或者目录;

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

//“匹配零个或多个目录。例如,“a//b”匹配“a/b”,“a/x/b”,“a/x/y/b”等;

其他连续的星号被视为无效;

注意事项(NOTES)

gitignore 文件的目的:确保那些 Git 由保留的不跟踪的某些文件不被追踪;

要停止跟踪某个已经跟踪的文件,使用git rm –cached(删除已经跟踪的文件,但是文件保留在工作目录中)

简单示例(EXAMPLES)

示例一:
$ 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 – .gitignore exclude folder but include specific subfolder

**

!.gitignore
!/path/to/folder
!/path/to/file

# 如果希望忽略整个目录,但保留某个子目录
!/path/
!/path/to/
!/path/to/tgtfile

相关文档

git-rm(1), gitrepository-layout(5), git-check-ignore(1)

GIT

Part of the git(1) suite

参考文献

man 5 gitignore, version Git 2.14.1
https://git-scm.com/docs/gitignore