忽略文件

在项目开发中,并非所有文件都适合纳入版本控制。例如编译产生的二进制文件、本地配置文件、日志文件或庞大的依赖库目录。Git 提供了一种机制,可以主动忽略这些文件,使它们不被 git status 或 git add 追踪。

这就是 .gitignore 文件。

1. 为什么需要忽略文件?

忽略文件主要有以下三个目的:

  1. 保持仓库整洁:排除编译产物(如 .class、.exe、node_modules),避免无关文件干扰代码审查。
  2. 控制仓库体积:依赖库和二进制文件通常体积巨大,且可以通过源码重新生成,无需纳入版本库,以免仓库膨胀影响克隆速度。
  3. 安全与隐私:排除包含敏感信息的配置文件(如数据库密码、API 密钥),防止机密数据上传到远程仓库。

2. 如何配置

在 Git 仓库的根目录下创建一个名为 .gitignore 的文件。在该文件中列出需要忽略的文件或目录规则。

注意:文件名必须是 .gitignore,且没有后缀名。

3. 规则语法详解

.gitignore 文件使用简单的“glob 模式”匹配规则,类似于正则表达式但更简单。

符号 作用说明 示例
空行 以 # 开头的行为注释。
# 注释 匹配任意个字符(除 / 外)。 # 这是一个注释
* 用于分隔规则,增加可读性。 *.log 忽略所有 .log 文件
? 匹配单个字符(除 / 外)。 file?.txt 匹配 file1.txt 但不匹配 file10.txt
[] 匹配括号内的单个字符。 file[123].txt 匹配 file1, file2, file3
/ 目录分隔符,或表示根目录。 /TODO 仅忽略根目录下的 TODO 文件
** 匹配任意层级的目录。 doc/**/*.pdf 忽略 doc 目录下所有的 .pdf 文件
! 取反,表示不忽略该文件。 !keep.log 即使忽略了 *.log,但不忽略 keep.log

4. 常见配置示例

以下是不同开发场景下的常用忽略规则组合:

忽略操作系统生成的文件:

# macOS 系统文件
.DS_Store

# Windows 缩略图
Thumbs.db

忽略编译产物和依赖目录:

# Node.js 依赖目录
node_modules/

# Java 编译文件
*.class

# Python 缓存
__pycache__/
*.py[cod]

忽略日志和临时文件:

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

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

例外规则(取反)示例:

假设你想忽略所有的 .txt 文件,但唯独需要保留 important.txt:

*.txt
!important.txt

5. 重要注意事项:已跟踪文件无法忽略

这是新手最容易遇到的陷阱:.gitignore 只能忽略尚未被纳入版本控制的文件。

如果一个文件已经被 git add 并 git commit 提交到了版本库,那么之后再将它添加到 .gitignore 中是无效的,Git 依然会追踪它的变更。

解决方案:

如果你需要让 Git 停止追踪某个已被管理的文件,需要执行以下两步:

  1. 从版本库中移除(但保留在本地工作区):
git rm --cached <filename>

如果是目录,使用 git rm -r --cached <directory>

  1. 提交变更:
git commit -m "停止追踪指定文件"

执行完上述操作后,该文件就会从版本库中删除(历史记录依然存在),此时 .gitignore 的规则就会生效,Git 将不再过问该文件的后续变更。

6. 小贴士

配置全局忽略:如果你希望所有项目都忽略某些特定的系统文件(如 .DS_Store),可以配置一个全局的 gitignore 文件:

git config --global core.excludesfile ~/.gitignore_global

不要忽略锁定文件:像 package-lock.json 或 yarn.lock 这类文件虽然由工具生成,但它们锁定了依赖版本,不应被忽略,否则会导致团队开发环境不一致。