忽略Git中的文件和目录(.gitignore)

通常,在使用Git的项目上工作时,您会希望排除将特定文件或目录推送到远程存储库中的情况。 这是哪里 .gitignore 文件派上用场了。

.gitignore 文件指定Git应忽略的未跟踪文件。

应该忽略哪些文件? #

忽略的文件通常是特定于平台的文件,或者是从构建系统自动创建的文件。 一些常见的示例包括:

  • 运行时文件,例如日志,锁定,缓存或临时文件。
  • 具有敏感信息(例如密码或API密钥)的文件。
  • 编译后的代码,例如 .class 要么 .o
  • 依赖目录,例如 /vendor 要么 /node_modules
  • 构建目录,例如 /public/out, 要么 /dist
  • 系统文件如 .DS_Store 要么 Thumbs.db
  • IDE或文本编辑器配置文件。

.gitignore 模式#

.gitignore 是纯文本文件,其中每行包含一个模式,供文件或目录忽略。

它使用通配符模式将文件名与通配符匹配。 如果文件或目录包含通配符模式,则可以使用单个反斜杠()以逃脱角色。

评论 #

以井号(#)是注释,将被忽略。 空行可用于提高文件的可读性并对相关的模式行进行分组。

斜线号

斜杠符号(/)代表目录分隔符。 模式开头的斜线是相对于目录的 .gitignore 居住。

如果模式以斜杠开头,则仅在存储库根目录中匹配文件和目录。

如果模式不是以斜杠开头,则它将匹配任何目录或子目录中的文件和目录。

如果模式以斜杠结尾,则仅匹配目录。 当目录被忽略时,其所有文件和子目录也将被忽略。

文字文件名

最直接的模式是没有任何特殊字符的文字文件名。

PatternExample匹配/access.logaccess.logaccess.logaccess.loglogs/access.logvar/logs/access.logbuild/build

通配符符号

* -星号符号匹配零个或多个字符。

PatternExample匹配*.logerror.loglogs/debug.logbuild/logs/error.log

** -两个相邻的星号符号匹配任何文件或零个或多个目录。 当后跟斜杠(/),则仅匹配目录。

PatternExample匹配logs/**匹配 logs 目录。**/buildvar/buildpub/buildbuildfoo/**/barfoo/barfoo/a/barfoo/a/b/c/bar

? -问号与任何单个字符匹配。

PatternExample匹配access?.logaccess0.logaccess1.logaccessA.logfoo??fooabfoo23foo0s

方括号 #

[...] -匹配方括号中包含的任何字符。 当两个字符用连字符分隔时 - 它表示一个字符范围。 该范围包括这两个字符之间的所有字符。 范围可以是字母或数字。

如果后面的第一个字符 [ is an exclamation mark (!), then the pattern matches any character except those from the specified set.

PatternExample matches*.[oa]file.ofile.a*.[!oa]file.sfile.1file.0access.[0-2].logaccess.0.logaccess.1.logaccess.2.logfile.[a-c].outfile.a.outfile.b.outfile.c.outfile.[a-cx-z].outfile.a.outfile.b.outfile.c.outfile.x.outfile.y.outfile.z.outaccess.[!0-2].logaccess.3.logaccess.4.logaccess.Q.log

取反模式

以感叹号(!)会否定(重新包含)先前模式忽略的所有文件。 此规则的例外是,如果排除了其父目录,则重新包含文件。

PatternExample匹配*.log!error.logerror.log 要么 logs/error.log 不会被忽略

.gitignore 例子#

以下是您的 .gitignore 文件可能如下所示:

# Ignore the node_modules directory
node_modules/

# Ignore Logs
logs
*.log

# Ignore the build directory
/dist

# The file containing environment variables 
.env

# Ignore IDE specific files
.idea/
.vscode/
*.sw*

本地 .gitignore

本地人 .gitignore 文件通常放置在存储库的根目录中。 但是,您可以创建多个 .gitignore 存储库中不同子目录中的文件。 中的图案 .gitignore 文件相对于文件所在目录匹配。

驻留在较低级别目录(子目录)中的文件中定义的模式优先于较高级别目录中的模式。

本地 .gitignore 文件与其他开发人员共享,并且应包含对存储库的所有其他用户有用的模式。

个人无视规则

应该在本地存储库中设置特定于本地存储库且不应分发到其他存储库的模式。 .git/info/exclude 文件。

例如,您可以使用此文件来忽略个人项目工具中生成的文件。

全球 .gitignore

Git还允许您创建一个全局 .gitignore 文件,您可以在其中为本地系统上的每个Git存储库定义忽略规则。

该文件可以命名为任意名称,并存储在任何位置。 保留此文件的最常见位置是主目录。 您必须手动创建文件并配置Git才能使用它。

例如,设置 ~/.gitignore_global 作为全局Git忽略文件,您可以执行以下操作:

  1. 创建文件:

    touch ~/.gitignore_global
  2. 将文件添加到Git配置:

    git config --global core.excludesfile ~/.gitignore_global
  3. 使用文本编辑器打开文件,然后向其中添加规则。

全局规则对于忽略您永远不想提交的特定文件(例如具有敏感信息的文件或已编译的可执行文件)特别有用。

忽略以前提交的文件

您的工作副本中的文件可以被跟踪也可以被跟踪。

要忽略先前提交的文件,您需要取消暂存并从索引中删除该文件,然后在 .gitignore

git rm --cached filename

--cached 选项告诉git不要从工作树中删除文件,而只是从索引中删除它。

要递归删除目录,请使用 -r 选项:

git rm --cached filename

如果要同时从索引和本地文件系统中删除文件,请省略 --cached 选项。

递归删除文件时,请使用 -n 选项将执行“空运行”并显示要删除的文件:

git rm -r -n directory

调试 .gitignore 文件号

有时要确定为什么要忽略特定文件可能会很有挑战性,尤其是当您使用多个文件时 .gitignore 文件或复杂模式。 这是 git check-ignore 用命令 -v 告诉git显示有关匹配模式的详细信息的选项很方便。

例如,检查为什么 www/yarn.lock 文件将被忽略,您将运行:

git check-ignore -v www/yarn.lock

输出显示到的路径 gitignore 文件,匹配行号和实际模式。

www/.gitignore:31:/yarn.lock	www/yarn.lock

该命令还接受多个文件名作为参数,并且该文件不必存在于您的工作树中。

显示所有忽略的文件

git status 用命令 --ignored 选项显示所有被忽略文件的列表:

git status --ignored

结论#

.gitignore 文件允许您将文件排除在检入存储库之外。 该文件包含用于描述应忽略哪些文件和目录的定位模式。

gitignore.io是一项在线服务,可让您生成 .gitignore 适用于您的操作系统,编程语言或IDE的文件。

如果您有任何疑问或反馈,请随时发表评论。

吉特

Sidebar