.gitignore文件的规范

22 阅读2分钟

.gitignore 文件用于指定 Git 版本控制中需要忽略的文件和目录,避免不必要的文件被跟踪。

基本规则

  1. 空行与注释

    • 空行:被忽略,用于分隔规则。
    • 注释:以 # 开头,例如:
    # 忽略日志文件
    *.log
    
  2. 忽略文件/目录

    temp.txt      # 忽略所有 temp.txt文件
    build/        # 忽略所有 build 目录
    
  3. 通配符

    • *:匹配任意字符(除路径分隔符 /)。
    *.tmp        # 忽略所有 .tmp 后缀文件
    
    • ?:匹配单个字符。
    ??test.txt   # 忽略 aatest.txt、abtest.txt 等
    
    • []:匹配括号内任一字符。
    [abc].txt    # 忽略 a.txt、b.txt、c.txt
    
  4. 路径分隔符 /

    • 开头 /:仅匹配项目根目录。
    /config.env  # 忽略根目录的 config.env(不忽略 src/config.env)
    
    • 结尾 /:仅匹配目录(不匹配同名文件)。
    dist/       # 忽略所有 dist 目录(不忽略 dist 文件)
    
  5. 双星号 **

    • 匹配任意层级目录:
    logs/**/*.log # 忽略 logs/ 下所有子目录的 .log 文件
    **/debug      # 忽略所有名为 debug 的目录/文件
    

进阶规则

  1. 取反规则 !

    • 在忽略规则中排除特定文件(必须写在忽略规则之后):
    *.js           # 忽略所有 .js 文件
    !index.js      # 不忽略根目录的 index.js
    
    • 注意:若父目录被忽略,! 无法生效(如 logs/** 被忽略后,!logs/error.log 无效)。
  2. 目录与文件的区别

    • 规则不包含 / 时,同时匹配文件和目录:
      cache      # 忽略 cache 文件和 cache/ 目录
      
    • 明确目录时添加 / 后缀:
      cache/     # 仅忽略 cache 目录
      

示例解析

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

# 不忽略 target/ 下的 Example.class
!target/Example.class

# 忽略根目录的 .env 文件
/.env

# 忽略 node_modules 目录(任意位置)
node_modules/

# 忽略 docs 目录下所有 .md 文件(除 README.md)
docs/*.md
!docs/README.md

# 忽略 logs/ 及其子目录的所有文件
logs/**

优先级与匹配顺序

  • 规则按行从上到下匹配,后面的规则覆盖前面的冲突部分
  • 同一目录可存在多层 .gitignore 文件,子目录规则优先级更高

注意事项

  1. 已跟踪文件的处理

    • .gitignore 对已加入版本控制的文件无效。需先删除跟踪:
      git rm --cached <file>  # 停止跟踪但不删除文件
      git commit -m "停止跟踪文件"
      
  2. 全局忽略配置

    • 创建全局规则(适用于所有项目):
      git config --global core.excludesFile ~/.gitignore_global