.gitignore 的匹配规则

.gitignore 是使用 Git 的日常开发时一个非常常见的文件。它负责告诉 Git 哪些文件或目录应当被忽略,不被加入版本控制。必须掌握。

基本规则

  • .gitignore 文件对其所在目录以及所有子目录生效。

  • 每行一条规则:

    • 空行:无意义。
    • # 开头:注释。
  • 匹配的是相对路径,相对于 .gitignore 所在目录的路径。

路径匹配规则

不带 / 的规则

log

匹配任意层级下名为 log 的文件或目录:

  • log
  • app/log
  • src/debug/log

/ 开头的规则

/log

仅匹配当前目录下的 log,不会影响子目录:

  • 匹配:./log
  • 不匹配:./src/log

如果 .gitignore 在仓库根目录,则仅忽略根目录的该项。

/ 结尾的规则(指定目录)

cache/

表示忽略 cache 目录及其全部内容:

  • 匹配:cache/, cache/tmp/a.txt
  • 不匹配:cache.log

通配符模式

* 匹配任意字符(不含 /

*.log

匹配所有 .log 文件:

  • a.log
  • error.log
  • dir/debug.log

? 匹配单个字符(不含 /

config?.json
  • 匹配:config1.json, configA.json
  • 不匹配:config10.json

[] 匹配字符集合

file[0-9].txt
  • 匹配:file0.txt ~ file9.txt
  • 不匹配:file10.txt

** 的强大跨目录匹配

** 可以匹配任意多层目录。

logs/**/debug.log

匹配:

  • logs/debug.log
  • logs/a/debug.log
  • logs/a/b/c/debug.log

常用写法:

**/temp/
**/*.log

含义分别为:所有层级下的 temp 目录;所有层级下的 .log 文件。

取反规则:! 用于“取消忽略”

.gitignore 中,以 ! 开头的规则表示 例外,即“不忽略某些文件”。

示例:

*.log
!important.log

表示忽略所有 .log,但保留 important.log

注意两点:

  1. 取反规则只有在前面已被忽略的前提下才有效。
  2. 若目录本身被忽略,则目录内部的文件不能通过 ! 被“救回”:

错误示例:

cache/
!cache/keep

keep 无法被恢复,因为 cache/ 整个被忽略。

正确示例:

cache/*
!cache/.gitkeep

匹配顺序与优先级

  • .gitignore 从上到下依次处理规则。
  • 后面的规则会覆盖前面的规则。

示例:

*.log          # 忽略所有 .log
!main.log      # 保留 main.log
/debug/main.log  # 再次忽略 debug 目录下的 main.log

多个 .gitignore 配合使用

Git 会综合以下来源的忽略规则:

  • 仓库根目录的 .gitignore
  • 子目录中的 .gitignore
  • 全局 Git 忽略文件(如 ~/.config/git/ignore
  • Git 内置忽略(如 .git/info/exclude)

路径始终相对当前 .gitignore 解析。

常见项目的 .gitignore 示例

Node.js / 前端项目

node_modules/
dist/
build/

*.log
npm-debug.log*
yarn-debug.log*

.env
.env.local

Python 项目

__pycache__/
*.py[cod]
venv/
.env
*.sqlite3
posted @ 2025-12-11 00:41  Ofnoname  阅读(3)  评论(0)    收藏  举报