.gitignore 忽略清单


.gitignore 忽略清单文件负责匹配那些不希望被 git 托管的文件。

将不需要被 git 管理的文件匹配规则添加到此文件中,在执行 git 命令的时侯,git 就会忽略这些文件。

使用

在项目根目录下创建名为 .gitignore 的清单文件,配置需要忽略的文件列表

.gitignore 文件更新时若目标文件已暂存,需要移除目标文件的暂存状态才能生效

规则语法

.gitignore 文件中每一行均视为一条文件匹配规则。每条规则均基本以glob 模式进行匹配。
关于 glob 模式可参考 glob文件匹配规则

这里仅列举常用规则:

  1. # 开头的行视为注释行,不会计入匹配规则
  2. / 开头表示根目录,反之则指向 .gitignore 文件所在目录内的所有目录
  3. / 结尾表示目录,将会忽略目录以及目录下的所有子文件。若不以 / 结尾则会因为不确定是目录还是文件,而忽略目录的同时忽略掉以此命名的文件
  4. / 分割每一层目录,在每层目录中,通配符 * 可以匹配任意多个字符
  5. ** 可以视为任意层数目录,因此 a/**/1 可以匹配到 a/1a/b/1a/b/c/1
  6. ? 可以视为任意单个字符
  7. ! 开头表示不忽略此行规则所匹配的文件
  8. [] 包含单个字符的匹配列表,例如 [ab] 指代此字符允许为 ab[0-9] 指代此字符允许为任意数字

示例

下面通过示例直观解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# .gitignore 的 注释
# 内容
# 忽略所有 .js 后缀的文件
*.js
# 忽略所有的 .js 和 .ts 文件
*.[jt]s
# 忽略所有的 test1.js、test2.js ... 文件
test[0-9].js
# 忽略所有的 test1.js、test2.js、testa.js、testb.js ... 文件
test?.js
# 忽略除 mari.js 外的其他文件
!mari.js
# 忽略项目中所有的 data 文件/目录
data
# 忽略项目中所有的 data 目录,不忽略 data 文件
data/
# 仅忽略项目根目录下的 data 文件/目录,不包括 src/data
/data
# 仅忽略项目根目录下的 data 目录,不忽略 data 文件
/data/
# 忽略项目根目录下的 data 目录内的第一级子文件中以 .yml 为后缀的文件,不包括 data/my/config.yml
/data/*.yml # 忽略doc目录下所有 .txt 后缀的文件,但不包括doc子目录的 .txt 的文件
# 忽略项目根目录下的 data 目录中的所有以 .yml 为后缀的文件
/data/**/*.yml
# 忽略具体的 /data/config/base.yml 文件
/data/config/base.yml

规则冲突

这里有一个需求: :忽略目录 src/plugin 下除了 src/plugin/@helpsrc/plugin/tools 以外的目录

本人依照惯性思维进行了如下的 ignore 规则配置:

1
2
3
/src/plugins/
!/src/plugins/@help/
!/src/plugins/tools/

结果发现后两条取反没有生效,@helptools 目录依然被 git 过滤掉了。

这里就牵扯到了规则文件的一个坑点,即:

git 对于配置文件规则的读取是按照从上到下进行规则匹配的,这代表着当前面的规则匹配范围更大时,后面的规则将不再生效。

显然 /src/plugins/ 在这里的范围是要大于后续两条取反规则的,导致了后两条规则无效化。

怎么解决这个问题呢?只需要添加一个 * 即可:

1
2
3
4
# /src/plugins/* 的范围小于后两条,取反规则成功生效
/src/plugins/*
!/src/plugins/@help/
!/src/plugins/tools/