跳到主要内容

`.gitignore`

.gitignore 文件指定哪些尚未被跟踪的文件应由 Git 忽略。它不会让 Git 停止跟踪已在索引中的文件,也不会删除提交历史中的内容。这些规则可用于排除敏感信息、用户本地配置、开发环境产生的临时文件,或可通过包管理器复现的依赖项。

语法与结构​

.gitignore 文件基于 glob 模式(通配符)来匹配文件名和路径。基本规则如下:

  • 空行:会被忽略,通常用于视觉上的分隔和排版。
  • 注释:以 # 开头的行被视为注释,不会生效。
  • Glob 模式:用于匹配文件或路径,常用符号包括:
    • *:匹配零个或多个字符,但不匹配 /。
    • ?:匹配恰好一个字符,但不匹配 /。
    • [...]:匹配方括号内指定的任意单个字符。
    • **/:递归匹配任意层级的目录。

常见模式示例​

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

# 忽略特定文件
secret.txt

# 忽略 tmp 目录下的所有文件
tmp/*

# 忽略 docs 目录下的所有 .txt 文件
docs/*.txt

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

# 忽略任意层级目录下的所有 .pdf 文件
**/*.pdf

最佳实践​

  • 共享、嵌套与个人规则:把全仓库共享的规则写入根目录的 .gitignore 并提交;只有 Git 会遍历的目录,其 .gitignore 才能补充或覆盖规则。如果父目录被忽略,必须先取消对父目录的忽略,子目录中的规则才能重新纳入文件。仅供个人在当前仓库使用的模式放入 .git/info/exclude;跨仓库通用的个人模式则通过 core.excludesFile 配置。
  • 尽早提交:在项目初始化阶段就创建并提交 .gitignore。这能防止在开发早期意外将构建产物或敏感文件纳入版本控制,避免后续清理的麻烦。
  • 处理已提交的敏感数据:如果密钥或凭据已经被提交,首先轮换或撤销该凭据。仅仅将路径加入 .gitignore 不会从 Git 历史中删除已存在的文件。必须使用 git filter-repo、BFG Repo-Cleaner 或托管平台提供的历史重写工具来清除历史记录,并通知所有协作者重新克隆或拉取重写后的历史。
  • 使用模板:大多数项目类型都有通用的忽略需求。推荐使用 gitignore.io 等工具生成针对特定语言或框架(如 Java, Python, Node.js)的预置模板,以此作为起点。

Java 项目 .gitignore 示例​

# 编译后的类文件
*.class

# 构建输出目录
target/
out/

# 打包文件
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# Maven 相关
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties

# IntelliJ IDEA
.idea/
*.iml
*.iws

# Eclipse
.classpath
.project
.settings/

# macOS 系统文件
.DS_Store

一个配置完善的 .gitignore 是保持仓库整洁和安全的基础。它不仅能减少仓库体积,更能有效防止无关文件或敏感信息被意外提交。

对照 GitHub 的 gitignore 模板库 中相应语言、编辑器的文件,逐条判断项目是否需要这些规则;拿不准的路径可用 git check-ignore -v 查看匹配来源。模板只是起点,它不知道项目有意跟踪了哪些生成文件。

探索关联打开关联网络