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

时间:2020-03-05 15:25:38  来源:igfitidea点击:

通常,在处理使用Git的项目时,我们会希望排除将特定文件或者目录推送到远程存储库中的情况。
这是'.gitignore'文件派上用场的地方。

“ .gitignore”文件指定Git应该忽略哪些未跟踪的文件。

应该忽略哪些文件?

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

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

'.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'
'构建/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.x.out'
“file.y.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