文章目录
通常,在使用Git的项目上工作时,您会希望排除将特定文件或目录推送到远程存储库中的情况。
.gitignore
文件指定Git应该忽略的未跟踪文件。
应忽略哪些文件?
被忽略的文件通常是特定于平台的文件或从构建系统自动创建的文件。一些常见的例子包括:
- 运行时文件,例如日志,锁定,缓存或临时文件。
- 具有敏感信息的文件,例如密码或API密钥。
- 已编译的代码,例如
.class
或.o
。 - 依赖目录,例如
/vendor
或/node_modules
。 - 建立目录,例如
/public
,/out
或/dist
。 - 系统文件,例如
.DS_Store
或Thumbs.db
- IDE或文本编辑器配置文件。
.gitignore
模式
.gitignore
文件是纯文本文件,其中每行包含一个模式,供文件或目录忽略。
.gitignore
使用 globbing pattern 来匹配带通配符的文件名。如果文件或目录包含通配符模式,则可以使用单个反斜杠(\
)来转义字符。
评论
以井号(#
)开头的行是注释,将被忽略。空行可以用来提高文件的可读性,并可以对相关的模式行进行分组。
斜线
斜杠符号(/
)表示目录分隔符。模式开头的斜线相对于.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
文件的外观示例:
# 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忽略文件,您可以执行以下操作:
创建文件:
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
文件或复杂格式时。这是带有-v
选项的 git check-ignore
命令的用处,告诉git显示有关匹配模式的详细信息。
例如,要检查为什么忽略www/yarn.lock
文件,可以运行:
git check-ignore -v www/yarn.lock
输出显示gitignore
文件的路径,匹配行的编号和实际模式。
www/.gitignore:31:/yarn.lock www/yarn.lock
该命令还接受多个文件名作为参数,并且文件不必存在于您的工作树中。
显示所有被忽略的文件
带有--ignored
选项的git status
命令显示所有被忽略文件的列表:
git status --ignored
结论
.gitignore
文件使您可以从检入存储库中排除文件。该文件包含用于描述应忽略哪些文件和目录的定位模式。
gitignore.io 是一种在线服务,可让您为操作系统,编程语言或IDE生成.gitignore
文件。
如果您有任何问题或反馈,请随时发表评论。