跳至主要内容

如何使用 .gitignore:含示例的实用入门

学习如何使用 .gitignore 保持 Git 仓库整洁。本教程涵盖基础、常见用法与实用示例,助您快速上手!
· 8分钟 阅读

使用 AI 探索

在使用 Git 时,让仓库保持整洁有序不仅是最佳实践,更是顺畅协作与高效版本控制的基础。这就是 .gitignore 派上用场的地方。这个便捷的文件会告诉 Git 忽略哪些文件,避免无谓的杂乱,并让您的提交聚焦于真正重要的内容。

如果没有 .gitignore,您的仓库很快就会被临时文件、日志以及其他不该纳入版本控制的内容填满。更糟的是,您可能会不小心共享敏感信息。

在本教程中,您将学习如何创建并使用 .gitignore 文件,让项目保持整洁,避开常见陷阱,并更高效地使用 Git。让我们开始吧!

什么是 .gitignore 文件?

.gitignore 是 Git 中的一个配置文件,用于指示版本控制系统在暂存或提交变更时应忽略哪些文件或目录。

它可以防止临时文件、系统生成文件或构建产物等不必要的文件弄乱您的仓库。保持仓库干净有助于协作,并确保只跟踪必要的文件。

.gitignore 是一个简单的文本文件,通常放置在 Git 仓库的根目录中。它包含告诉 Git 忽略哪些文件或目录的模式。这些模式可以根据项目需求自定义,帮助您维护结构良好的仓库。

刚接触 Git 和 GitHub?通过这篇 GitHub 与 Git 入门教程获取对版本控制的友好介绍。

以下是一些应考虑忽略的常见文件和目录类别:

  • 构建产物:构建过程中生成、可由源代码重新创建的文件,例如:
    • dist/、build/(前后端构建输出)
    • target/(Java 等编译型语言的构建产物)
  • 依赖:包管理系统会为已安装的库创建目录,这些目录不应被跟踪:
    • node_modules/(Node.js)
    • vendor/(PHP,Composer)
    • .venv/、venv/(Python 虚拟环境)
  • 系统特定文件:由操作系统自动生成,对项目没有贡献:
    • .DS_Store(macOS)
    • Thumbs.db(Windows)
  • IDE 配置文件:每位开发者的开发环境不同,其个人设置不应纳入版本控制:
    • .vscode/(VS Code)
    • .idea/(JetBrains 系列 IDE)
    • .project、.settings/(Eclipse)
  • 日志与临时文件:为避免不必要的杂乱,应忽略日志、缓存和临时文件:
    • *.log、npm-debug.log*、yarn-debug.log*、yarn-error.log*(各类工具的日志)
    • *.tmp、*.bak(临时与备份文件)
    • .mypy_cache/、__pycache__/(Python 缓存)
    • .ipynb_checkpoints/(Jupyter Notebook 检查点)
  • 环境与机密文件:敏感凭据与特定环境配置绝不应被提交:
    • .env、.env.local、.env.development、.env.production
    • secrets.json、config.json(敏感配置文件)
  • 数据库与存储文件:这些在本地生成,不应纳入版本控制:
    • *.sqlite、*.sqlite3、*.db(SQLite 数据库文件)
    • dump.rdb(Redis 数据库转储)
  • CI/CD 与覆盖率文件:测试覆盖率报告与其他 CI/CD 产物应被忽略:
    • coverage/、*.lcov(代码覆盖率报告)
    • .tox/、.pytest_cache/(Python 测试相关文件)

需要安装 Git?请按照我们的分步指南参见这篇 Git 安装教程,帮助您快速完成设置。

.gitignore 的语法

如前所述,.gitignore 文件包含与仓库中文件名进行匹配的模式,以确定是否应忽略它们。

基础语法

.gitignore 文件的核心是由多行组成,每一行代表一个要忽略的模式。模式可以匹配:

  • 特定文件
  • 文件类型
  • 目录

该文件也支持注释,行首以 # 开头即可;另外可以使用空行来提升可读性。

下面是基本结构概览:

  • 忽略特定文件: 可直接列出文件名来忽略它。
secrets.txt
  • 忽略整个目录: 在目录名末尾添加 /,即可忽略该目录中的所有内容。
logs/
  • 忽略某一类文件: 可使用通配符(*)忽略具有特定扩展名的所有文件。
*.py
  • 取反:可以使用 ! 来对某个模式取反,显式跟踪原本会被忽略的特定文件或目录。
*.txt  # 忽略所有 .txt 文件
!readme.txt  # 但不忽略 readme.txt

如何创建并使用 .gitignore 文件

创建并使用 .gitignore 相当直接。本节将带您逐步完成。

创建 .gitignore 文件

步骤 1:进入仓库根目录。.gitignore 文件通常放在 Git 项目的根目录。打开终端或命令行,进入您的 Git 仓库根目录:

cd /path/to/your/repo

步骤 2:创建 .gitignore 文件。进入根目录后,使用任意文本编辑器创建 .gitignore 文件,或在终端运行如下命令:

touch .gitignore

步骤 3:向文件添加模式。在文本编辑器中打开 .gitignore,添加需要忽略的文件或目录模式。每一行代表一个模式。

下面是一个基础项目中常用的 .gitignore 示例:

# 忽略 node_modules 与依赖目录
node_modules/
vendor/

# 忽略构建产物
dist/
build/
*.log

# 忽略系统生成文件
.DS_Store
Thumbs.db

# 忽略环境与机密文件
.env
config.json

添加完必要的模式后,保存文件。此后在暂存或提交变更时,Git 将自动忽略这些文件。

步骤 4:将文件提交到仓库。务必将 .gitignore 提交到仓库,以便所有协作者使用相同的忽略规则,确保整个项目的一致性。

git add .gitignore
git commit -m "Add .gitignore file"
git push

一旦提交了 .gitignore 文件,您就为整个团队建立了共享的忽略规则。

想熟练掌握 Git 的 push 与 pull?了解如何与远程仓库同步工作,请查看这篇 Git 推送与拉取教程。

使用 .gitignore 的最佳实践

虽然创建 .gitignore 是维护干净 Git 仓库的基础操作,但为了长期有效地管理它,还应遵循若干最佳实践。

使用全局 .gitignore

对于在多个项目间工作的开发者,有些文件您可能希望在任何仓库中都排除,无论项目类型如何。

与其在每个项目的 .gitignore 中重复添加,不如配置一个全局 .gitignore,使其适用于系统中的所有仓库。

配置全局 .gitignore 文件的方法:

  • 创建 .gitignore_global 文件:
touch ~/.gitignore_global
  • 添加希望全局忽略的模式,例如:
.DS_Store
*.log
/.vscode/
/.idea/
  • 设置 Git 使用全局 .gitignore:
git config --global core.excludesfile ~/.gitignore_global

利用现成模板

无需每个新项目都从零编写 .gitignore,您可以使用针对特定语言、框架或环境的预配置模板。

其中一个最佳资源是GitHub 官方 .gitignore 仓库,您可以在其中找到覆盖数百种编程语言与框架的 .gitignore 文件。

定期审查 .gitignore

随着项目演进,可能会出现需要加入到 .gitignore 的新文件与目录。请定期审查并更新该文件,以反映项目的当前状态。

以下场景可能需要更新 .gitignore:

  • 采用会生成额外文件的新工具或库(如切换到新构建系统)。
  • 重构或调整目录结构,导致出现应排除的新文件。
  • 移除已废弃、不再属于项目的文件或目录。

.gitignore 故障排查

即使已设置好 .gitignore,您仍可能遇到特定文件被跟踪,或某些模式未按预期生效的情况。本节将涵盖两个常见排查方向及其解决方案。

已提交文件仍被跟踪

.gitignore 不会对已提交的文件追溯生效。

如果在某些文件已提交后才将其模式加入 .gitignore,即使它们匹配该模式,Git 仍会继续跟踪它们。

要停止跟踪已提交的文件,请按以下步骤操作:

  • 从 Git 跟踪中移除文件: 使用 git rm 命令将其从仓库中移除,但保留在工作区。
git rm --cached <file_or_directory_name>
  • 提交更改: 从 Git 跟踪中移除这些文件后,提交更改,确保它们不再属于版本控制历史的一部分。
git commit -m "Stop tracking ignored files"
  • 将更改推送到远程仓库:最后,将更改推送到远程仓库,确保这些文件不再被跟踪。
git push

完成以上步骤后,Git 将停止跟踪这些文件。工作区中仍会保留该文件,但基于您的 .gitignore 模式,后续提交会忽略它。

确保模式生效

有时,您可能会发现预期应被忽略的文件仍出现在 Git 状态中,或被跟踪。

请按以下步骤确认 .gitignore 模式是否正确生效:

  • 检查文件状态: 使用 git status 查看哪些文件被 Git 跟踪,以验证被忽略的文件是否仍被列出。
git status
  • 确认模式是否正确: 仔细检查 .gitignore 模式语法是否正确。例如:
    • 确保使用正确的目录路径(相对于仓库根目录)。
    • 为目标目录添加 /,以避免误将同名文件全部忽略。
  • 刷新缓存: 如果您刚更新了 .gitignore 但变更尚未生效,可能是 Git 仍在使用旧的缓存。可运行以下命令刷新缓存:
git rm -r --cached .
git add .
git commit -m "Refresh .gitignore"
  • 检查例外: 有时,.gitignore 中的某个模式可能被文件中更具体的规则覆盖。请检查规则,确保不存在冲突的模式。

想要快速查阅 Git?随时掌握常用命令,请查看这份 Git 速查表。

结语

.gitignore 文件虽小,却在保持 Git 仓库整洁可控方面发挥着巨大作用。通过忽略诸如依赖、构建产物以及系统生成文件等不必要内容,您可以确保项目结构清晰、远离杂乱。

在本教程中,您学习了如何创建 .gitignore 文件、添加模式并应用最佳实践以保持仓库高效。有了这些技能,您将避免版本控制方面的麻烦,也能让团队协作更加顺畅。

如果您希望进一步提升 Git 技能,请查看 Git Fundamentals 学习路径。您还可以探索实践课程,如 Foundations of Git 和 Introduction to GitHub Concepts,以系统掌握版本控制与协作工作流!

FAQs

将 .gitignore 中的文件会移除已被 Git 跟踪的文件吗?

不会。.gitignore 只会阻止新文件被跟踪。如果文件已在版本控制中,仅把它加入 .gitignore 并不会移除。要停止跟踪已提交的文件,您需要使用:

git rm --cached filename

然后提交更改。

我可以在一个项目中拥有多个 .gitignore 文件吗?

可以!您可以在项目的不同目录中放置多个 .gitignore 文件。每个文件仅对其所在目录及其子目录生效。

如何忽略某一类文件?

您可以使用通配符。例如,要忽略所有 .log 文件:

*.log

这将排除所有以 .log 为扩展名的文件。

我能忽略某个特定文件,但仍在本地跟踪以便自己使用吗?

可以,但您必须手动确保它不会被提交。一种临时方法是使用 git update-index --assume-unchanged filename。更好的做法是使用全局 .gitignore 文件(见下一个问题)。

什么是全局 .gitignore 文件,如何设置?

全局 .gitignore 用于忽略您机器上所有仓库的文件。这对 .DS_Store 或 Thumbs.db 等系统特定文件很有用。创建并配置全局 .gitignore 的方法:

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

然后按需向 ~/.gitignore_global 添加模式。

为什么我的 .gitignore 没有生效?

如果 .gitignore 未能忽略某个文件,请检查这些常见问题:

  • 文件已被跟踪——需要使用 git rm --cached filename 将其移除。
  • .gitignore 模式可能有误——请仔细检查语法。
  • 存在冲突规则——Git 会应用最后一个匹配规则,因此规则顺序很重要。
我能忽略某个目录,但保留其中的某个特定文件吗?

可以!使用排除规则。例如,忽略文件夹中的所有内容,但保留 keepme.txt:

folder_name/*
!folder_name/keepme.txt
如果两位团队成员的 .gitignore 不同会怎样?

如果 .gitignore 已提交到仓库,所有团队成员都会遵循相同规则。但若有人仅在本地修改了 .gitignore 而未提交,他们的忽略项可能不同。最佳做法是将 .gitignore 纳入版本控制,并由团队达成一致。

如何检查哪些文件被忽略?

运行以下命令查看 .gitignore 忽略了哪些文件:

git status --ignored

或获取更详细的列表:

git check-ignore -v filename

我可以撤销对 .gitignore 中某个文件的忽略吗?

可以!从 .gitignore 中移除该文件,然后使用:

git add filename

再次跟踪它,随后提交更改。

Kurtis Pykes

作者

Kurtis Pykes

主题