使用 .gitignore 忽略 Git 中的文件和目录
通常,在使用 Git 的项目上工作时,您会希望排除将特定文件或目录推送到远程存储库中的情况。可以使用 .gitignore
文件指定 Git 应忽略的未跟踪文件。
应该忽略哪些文件?
忽略的文件通常是特定于平台的文件,或者是从构建系统自动创建的文件。一些常见的示例包括:
- 运行时文件,例如日志,锁定,缓存或临时文件。
- 具有敏感信息(例如密码或 API 密钥)的文件。
- 编译的代码,例如
.class
或.o
。 - 依赖目录,例如
/vendor
或/node_modules
。 - 构建目录,如
/public
,/out
或/dist
。 - 系统文件,例如
.DS_Store
或Thumbs.db
- IDE或文本编辑器配置文件。
.gitignore
.gitignore
文件是一个纯文本文件,其中每一行定义了需要忽略文件或目录的模式。
.gitignore
使用通配符模式来匹配文件名。如果文件或目录包含通配符模式中的字符,则可以使用单个反斜杠 (\
) 来转义字符。
注释
以井号 (#
) 开头的行是注释,将被忽略。空行可用于提高文件的可读性并对相关的模式行进行分组。
斜杠
斜杠 (/
) 表示目录分隔符。模式开头的斜线是相对于 .gitignore
所在的目录。
如果模式以斜杠开头,则仅在存储库根目录中匹配文件和目录。
如果模式不是以斜杠开头,则它将匹配任何目录或子目录中的文件和目录。
如果模式以斜杠结尾,则仅匹配目录。当目录被忽略时,其所有文件和子目录也将被忽略。
文件名
最直接的模式是没有任何特殊字符的文字文件名。
模式 | 匹配示例 |
---|---|
/access.log |
access.log |
access.log |
access.log logs/access.log var/logs/access.log |
build/ |
build |
通配符
*
- 星号符号匹配零个或多个字符。
模式 | 匹配示例 |
---|---|
*.log |
error.log |
logs/debug.log |
|
build/logs/error.log |
**
- 两个相邻的星号符号匹配任何文件或零个或多个目录。当后跟斜杠 (/
) 时,它仅与目录匹配。
模式 | 匹配示例 |
---|---|
logs/** |
匹配 logs 目录内的任何内容。 |
**/build |
var/build pub/build build |
foo/**/bar |
foo/bar foo/a/bar foo/a/b/c/bar |
?
- 问号与任何单个字符匹配。
模式 | 匹配示例 |
---|---|
access ? .log |
access0.log access1.log accessA.log |
foo ?? |
fooab foo23 foo0s |
方括号
[...]
- 匹配方括号中包含的任何字符。当两个字符用连字符分隔时 -
,表示一个字符范围。该范围包括这两个字符之间的所有字符。范围可以是字母或数字。
如果 [
后面的第一个字符是感叹号 (!
) ,则该模式匹配除指定集合中的字符以外的任何字符。
模式 | 匹配示例 |
---|---|
*.[oa] |
file.o file.a |
*.[!oa] |
file.s file.1 file.0 |
access.[0-2].log |
access.0.log access.1.log access.2.log |
file.[a-c].out |
file.a.out file.b.out file.c.out |
file.[a-cx-z].out |
file.a.out file.b.out file.c.out file.x.out file.y.out file.z.out |
access.[!0-2].log |
access.3.log access.4.log access.Q.log |
取反模式
以感叹号 (!
) 开头的模式将否定(重新包括)先前模式忽略的任何文件。此规则的例外是,如果排除了其父目录,则重新包含文件。
模式 | 匹配示例 |
---|---|
*.log !error.log |
error.log 和 logs/error.log 将不会被忽略 |
.gitignore
示例
以下是一个 .gitignore
文件的示例:
# 忽略 node_modules 目录
node_modules/
# 忽略日志
logs
*.log
# 忽略构建目录
/dist
# 忽略环境变量目录
.env
# 忽略 IDE 设置
.idea/
.vscode/
*.sw*
本地 .gitignore
通常将 .gitignore
本地文件放在存储库的根目录中。但是,您可以 .gitignore
在存储库的不同子目录中创建多个文件。 .gitignore
文件中的模式相对于文件所在目录匹配。
子目录中的文件中定义的模式优先于较高级别目录中的模式。
本地 .gitignore
文件与其他开发人员共享,并且应包含对存储库的所有其他用户有用的模式。
私有的个人规则
应在 .git/info/exclude
文件中设置特定于本地存储库且不应分发到其他存储库的模式。
例如,您可以使用此文件来忽略个人项目工具中生成的文件。
全局 .gitignore
Git 还允许您创建一个全局 .gitignore
文件,您可以在其中为本地系统上的每个 Git 存储库定义忽略规则。
该文件可以命名为任意名称,并存储在任何位置。保留此文件的最常见位置是主目录。您必须手动创建文件并配置 Git 才能使用它。
例如,要将设置 ~/.gitignore_global
为全局 Git 忽略文件,请执行以下操作:
-
创建文件:
touch ~/.gitignore_global
-
将文件添加到 Git 配置:
git config --global core.excludesfile ~/.gitignore_global
-
使用文本编辑器打开文件,然后向其中添加规则。
全局规则对于忽略您永远不想提交的特定文件(例如带有敏感信息的文件或已编译的可执行文件)特别有用。
忽略以前提交的文件
您的工作副本中的文件可以被跟踪也可以不被跟踪。
要忽略先前提交的文件,您需要取消暂存并将其从索引中删除,然后在中为该文件添加规则 .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 生成文件。