平时记录 2025
.gitignore 的匹配规则
该文件用于排除 Git 跟踪的文件
1. 直接写名字
排出所有名字为 dist 的目录或文件,而且不管目录有多深,比如 /a/dist 也会被排除
dist
|- project
|-a
| |- dist 被排除
|
|- dist 被排除
2. 加 / 斜杠
斜杠在开头,
表示当前目录下对应的目录或文件( 当前目录就是 .gitignore 所在的目录 )
/dist
|- project
|-a
| |- dist 不会被排除
|
|- dist 根目录下的 dist 会被排除
斜杠在中间,
表示从当前目录出发,在 a 目录下的 dist 会被排除
a/dist
|- project
|-a
| |- dist 被排除
|
|- dist 不会被排除
斜杠在末尾,
跟直接写 dist 查不多,且不管目录的深度,唯一的不同的是排除的是目录,不包括文件
dist/
3. * 通配符
* 匹配 0 个到多个字符,但不包括 / 斜杠
比如排除掉一些日志文件,无论那个目录下面的日志文件都会被排除
*.log
|- project
|-a
| |- 2.log 被排除
|
|- 1.log 被排除
* 通配符和一些规则联合使用,比如只排除 logs 目录下所有 .log 文件
logs/*.log
|- project
|-logs
| |- 2.log 被排除
|
|- 1.log 不会被排除
两个星号 **,
一个 * 不匹配斜杠,它只排除 Logs 目录下的子文件,
两个 ** 星号,可以匹配任何字符,同时也可以匹配斜杠,可以排除目录了
比如排除 logs 目录下面所有的 .log 文件,不管目录有多少深
logs/**/*.log
|- project
|-logs
| |- sub
| | |- 3.log 被排除
| |
| |- 2.log 被排除
|
|- 1.log 不会被排除
4. ? 号
只匹配名字是一个字符的 .log 文件,
比如 2.log 可以被排除,如果两个数字 31.log 就不能被排除
logs/**/?.log
|- project
|-logs
| |- sub
| | |- 31.log 不能被排除
| |
| |- 2.log 被排除
|
|- 1.log 不会被排除
如果两个 ?? 号匹配两个连续的字符
5. [] 中括号里写具体的匹配规则,也只匹配一个字符,
比如 [0-9] 表示匹配一个字符,同时必须是数字,a.log 不是数字不能被排除
logs/**/[0-9].log
|- project
|-logs
| |- sub
| | |- 31.log 不能被排除
| |
| |- 2.log 被排除
| |- a.log 不能被排除
|
|- 1.log 不会被排除
6. ! 感叹号,表示在前面的基础上,排除一些
比如,不跟踪 upload 目录下面所有用户上传的东西,不管目录有多深全部移除
/upload/**/*.*
|- project
|-upload
|- sub
| |- 1.zip
|
|- 1.jpg
但是这样会出一个问题,
由于 upload 下面全部被移除了,远程仓库那边不会建立这个 upload 目录,服务器那边可能会出一些问题,
常见的做法是在 upload 目录下面建立一个 .gitkeep 文件,文件名可以随意命名,习惯上用 gitkeep
|- project
|-upload
|- sub
| |- 1.zip
|
|- .gitkeep 该文件的目的是不要被排除,远程仓库就要建立 upload 目录
|- 1.jpg
这样 upload 目录下面除了 .gitkeep 以外全部被排除了,.gitkeep 起到了远程仓库建立 upload 目录的作用
/upload/**/*.* !/upload/.gitkeep
一般在 .gitignore 的最后一行写上 !.gitkeep,保证在前面规则的基础上 .gitkeep 不会被排除
/upload/**/*.* !.gitkeep