忽略文件和最佳实践


你克隆了一个叫 weather-app 的项目,运行 npm install,然后检查新仓库的状态。
$ git status
Untracked files:
(use "git add <file>..." to include in what will be committed)
node_modules/
dist/
.env三个文件夹和文件显示为未追踪状态,它们都不应该被提交。node_modules/ 包含数千个文件,npm install 可以在几秒内从 package.json 重新生成。dist/ 是构建输出,每次都会从源代码重新构建。.env 包含 API 密钥。这些都不应该进入项目历史,而不假思索地输入 git add . 正是让它们进入的方式。
告诉 Git 哪些文件要忽略
.gitignore 文件列出了 Git 应该永远不追踪的文件和文件夹的模式。你在项目的根目录创建它一次,也就是在你的第一个仓库中运行 git init 的地方,从那时起,git status 和 git add . 会自动跳过任何匹配的内容。
# .gitignore
node_modules/
dist/
.env每一行都是一个模式:像 dist/ 这样的普通文件夹名称会忽略整个文件夹,无论它在项目中出现在哪里。提交 .gitignore 文件本身。它很小,对每个克隆项目的人都有用,它属于历史记录,就像你的源代码一样。
$ git status
On branch main
nothing to commit, working tree clean有了这些模式,git status 就安静了。这正是要点:你永远不想提交的文件夹和文件停止显示为噪音,这样真正重要的东西就会显示出来。
.gitignore 文件列出了 Git 应该永远不追踪的内容:node_modules/、dist/ 和 .env 在几乎任何项目中都是常见的。提交 .gitignore 文件本身,这样克隆项目的每个人都能获得相同的干净状态。我曾经在不知道这一点的情况下浪费了整个下午来暂存数千个依赖文件。 永远不要提交密钥
API 密钥、数据库密码或签名证书不应该出现在提交中。这对私有仓库和公共仓库同样适用,从第一次提交开始就要这样做。将密钥放在像 .env 这样的文件中,在第一天就将该文件添加到 .gitignore,然后从那里加载值到你的应用中,而不是将它们写入源文件。
# .env
WEATHER_API_KEY=sk_live_9f8e7d6c5b4a# .gitignore
.env自动遵循这个规则,每次都是,没有例外。坐在提交中的密钥对任何有权访问仓库的人都可以访问,在公共仓库上,对任何人都可以。
.env 这样的文件中,并在运行 git add 之前将 .env 添加到 .gitignore。这是整个章节中唯一值得视为绝对的规则。 追踪后将文件添加到 .gitignore
这是一个陷阱,几乎每个人至少都会掉进来一次。你不小心提交了一个文件,意识到你的错误,把它添加到 .gitignore(下面的 echo 行会将路径追加到该文件),期望 Git 忘记它。但它不会。
$ git add config/settings.json
$ git commit -m "Add app settings"
# 稍后,你意识到这是个错误
$ echo "config/settings.json" >> .gitignore
$ git status
On branch main
nothing to commit, working tree cleangit status 显示一个干净的树,但 config/settings.json 仍然被追踪,仍然会在每个未来的 git log 和每个克隆中显示。忽略规则只适用于 Git 还不知道的文件。一旦文件被添加和提交,它就成为你历史的一部分,.gitignore 对已经在该历史中的文件没有影响。
要实际上停止从此跟踪它,告诉 Git 停止跟踪该文件,同时将文件保留在磁盘上:
$ git rm --cached config/settings.json
$ git commit -m "Stop tracking config/settings.json"git rm --cached <file> 从 Git 的追踪中移除文件,而不从工作目录删除它。提交那个移除,从那时起你的 .gitignore 模式就可以做你从一开始想要它做的工作。
.gitignore 对该文件没有作用。忽略规则只适用于 Git 从未添加过的文件。要停止追踪不小心溜进来的文件,运行 git rm --cached <file> 并提交该更改。 好习惯:小提交和干净的仓库
整洁的 .gitignore 是保持仓库值得工作的一半。另一半是你如何塑造你的提交。使每个提交成为一个专注的变化:一个错误修复、一个小功能、一个单一重构。如果一个下午的工作涉及多个不相关的东西,将它分成多个提交,而不是在一天结束时全部放进一个。
$ git add src/weather-widget.js
$ git commit -m "Fix temperature rounding in weather widget"小提交更容易审查,出现问题时更容易还原,六个月后更容易回读,当你试图记住一行代码为什么存在时。提交循环涵盖了什么使提交信息有用;这个习惯是关于保持变化本身足够小,一个好信息甚至可能写出来。
.gitignore 覆盖永远不应该被追踪的文件夹和密钥。这两个习惯一起是使仓库值得工作的大部分原因。小习惯,在早期形成,可以为你节省许多后续清理。 
