Gitignore 规则总结

官方文档:https://git-scm.com/docs/gitignore

Gitignore 文件用于指定 Git 应该忽略哪些文件和目录,不将它们纳入版本控制。

放置位置

  • 项目根目录: 规则适用于整个仓库。
  • 子目录: 规则适用于该子目录及其所有子目录。

规则语法

  1. 空行或以 # 开头的行:被视为注释,会被忽略。
    # 这是一个注释
    
  2. 标准 glob 模式匹配
    • *:匹配零个或多个字符。
    • ?:匹配一个任意字符。
    • []:匹配括号中任意一个字符。
  3. 匹配目录:在模式末尾添加斜杠 / 来指定只匹配目录。
    temp/      # 忽略名为 temp 的目录及其所有内容
    
  4. 排除模式(否定):在模式前加 ! 来取消忽略。如果一个文件被前面的规则忽略了,但又被排除模式匹配,它将不被忽略。
    *.log       # 忽略所有 .log 文件
    !important.log # 但不忽略 important.log
    
  5. 开头斜杠 /:将模式锚定到 .gitignore 文件所在的目录。如果 .gitignore 在项目根目录,则锚定到项目根目录。
    /build      # 只忽略项目根目录下的 build 目录,不忽略 src/build
    
  6. 双星号 **
    • **/:匹配任意深度的文件或目录。**/logs 忽略任意目录下的 logs 目录。
    • pattern/**:匹配指定目录下的所有文件和子目录。docs/** 忽略 docs 目录下的所有文件和子目录。
    • a/**/b:匹配 a 目录下的任意深度的 b 文件或目录。例如,a/b, a/x/b, a/x/y/b

匹配顺序与优先级

  • 后来居上: .gitignore 文件中后出现的规则会覆盖先出现的规则。
  • 层级优先: 子目录中的 .gitignore 文件中的规则会覆盖父目录中的 .gitignore 文件中的规则。
  • 否定规则: 否定模式 (!) 重新包含先前被忽略的文件。被 ! 规则重新包含的文件不会再被同一个 .gitignore 文件中后续的规则排除。

注意事项

  • 已跟踪文件: 一旦文件已经被 Git 跟踪(即已经提交过),.gitignore 规则将不再对其生效。你需要使用 git rm --cached <file> 命令从 Git 索引中移除该文件,然后 Git 才会开始忽略它。

示例

# 忽略所有 .log 文件
*.log

# 忽略根目录下的 build 目录
/build

# 忽略 node_modules 目录及其内容
node_modules/

# 忽略所有 temp 目录,无论深浅
**/temp/

# 忽略所有 .txt 文件,但保留 important.txt
*.txt
!important.txt