.gitignore 文件——如何在 Git 中忽略文件和文件夹详细教程

Git 是一个流行的版本控制系统。开发人员通过它可以在项目上进行协作。 Git 允许你跟踪你在一段时间内对项目所做的修改。除此之外,如果你想撤销某个改动,它还可以让你恢复到以前的版本。 Gi

Share

Git 是一个流行的版本控制系统。开发人员通过它可以在项目上进行协作。

Git 允许你跟踪你在一段时间内对项目所做的修改。除此之外,如果你想撤销某个改动,它还可以让你恢复到以前的版本。

Git 的工作方式是,你用 git add 命令在项目中添加文件,然后用 git commit 命令提交文件。

当你作为团队的一员在一个项目上工作时,有时你不想与他人分享项目的某些文件或部分。

换句话说,你不想把这些特定的文件包含或提交到项目的主版本中。这就是为什么你可能不想在 git add 命令中使用句号 .,因为这样做会提交当前 Git 目录中的每一个文件。

当你使用 git commit 命令时,每一个文件都会被添加——这也包括那些不需要或不应该提交的文件。

你可能想让 Git 忽略特定的文件,但没有 git ignore 命令来实现这一目的。

那么,如何告诉 Git 忽略和不追踪特定的文件呢?用一个 .gitignore 文件。

在这篇文章中,你将了解什么是 .gitignore 文件,如何创建它,以及如何使用它来忽略文件和文件夹。你还会看到如何忽略一个先前提交的文件。

以下是我们要介绍的内容:

  1. 什么是 .gitignore 文件
  2. 如何创建一个 .gitignore 文件
  3. 在 .gitignore 文件中包含什么
  4. 如何在 Git 中忽略一个文件和文件夹
  5. 如何忽略一个先前提交的文件

什么是 .gitignore 文件?.gitignore 文件是用来做什么的?

在任何当前工作的 Git 仓库中,每个文件都是这样的:

  • 追踪的(tracked)– 这些是 Git 所知道的所有文件或目录。这些是新添加(用 git add 添加)和提交(用 git commit 提交)到主仓库的文件和目录。
  • 未被追踪的(untracked) – 这些是在工作目录中创建的,但还没有被暂存(或用 git add 命令添加)的任何新文件或目录。
  • 被忽略的(ignored) – 这些是 Git 知道的要全部排除、忽略或在 Git 仓库中不需要注意的所有文件或目录。本质上,这是一种告诉 Git 哪些未被追踪的文件应该保持不被追踪并且永远不会被提交的方法。

所有被忽略的文件都会被保存在一个 .gitignore 文件中。

.gitignore 文件是一个纯文本文件,包含了项目中所有指定的文件和文件夹的列表,这些文件和文件夹是 Git 应该忽略和不追踪的。

在 .gitignore 中,你可以通过提及特定文件或文件夹的名称或模式来告诉 Git 只忽略一个文件或一个文件夹。你也可以用同样的方法告诉 Git 忽略多个文件或文件夹。

如何创建一个 .gitignore 文件?

通常,一个 .gitignore 文件会被放在仓库的根目录下。根目录也被称为父目录和当前工作目录。根目录包含了组成项目的所有文件和其他文件夹。

也就是说,你可以把它放在版本库的任何文件夹中。你甚至可以有多个 .gitignore 文件。

要在基于 Unix 的系统(如 macOS 或 Linux)上用命令行创建一个 .gitignore 文件,打开终端程序(如 macOS 上的 Terminal.app)。然后,用 cd 命令导航到包含项目的根文件夹,并输入以下命令,为你的目录创建一个 .gitignore 文件:

touch .gitignore

名字前面有点(.)的文件默认是隐藏的。

当单独使用 ls 命令时,隐藏的文件是不可见的。要从命令行查看所有的文件–包括隐藏的文件–请在 ls 命令中使用 -a 标志,如图所示:

ls -a

在 .gitignore 文件中应包括什么?

你应该考虑添加到 .gitignore 文件中的文件类型是任何不需要被提交的文件。

你可能出于安全原因不想提交它们,或者因为它们是你的本地文件,因此对与你在同一项目上工作的其他开发者来说是不必要的。

其中一些可能包括:

  • 操作系统文件。每个操作系统(如 macOS、Windows 和 Linux)都会生成系统特定的隐藏文件,其他开发者不需要使用这些文件,因为他们的系统也会生成这些文件。例如,在 macOS 上,Finder 会生成一个 .DS_Store 文件,其中包括用户对文件夹的外观和显示的偏好,如图标的大小和位置。
  • 由代码编辑器和 IDE(IDE 代表集成开发环境)等应用程序生成的配置文件。这些文件是为你、你的配置和你的偏好设置定制的。
  • 从你的项目中使用的编程语言或框架自动生成的文件,以及编译后的代码特定文件,如 .o 文件。
  • 由软件包管理器生成的文件夹,如 npm 的 node_modules 文件夹。这是一个用于保存和跟踪你在本地安装的每个软件包的依赖关系的文件夹。
  • 包含敏感数据和个人信息的文件。这类文件的一些例子是含有你的凭证(用户名和密码)的文件和含有环境变量的文件,如 .env 文件(.env 文件含有需要保持安全和隐私的 API 密钥)。
  • 运行时文件,如 .log 文件。它们提供关于操作系统的使用活动和错误的信息,以及在操作系统中发生的事件的历史。

如何在 Git 中忽略一个文件和文件夹

如果你想只忽略一个特定的文件,你需要提供该文件在项目根目录下的完整路径。

例如,如果你想忽略位于根目录下的 text.txt 文件,你可以做如下操作:

/text.txt

而如果你想忽略一个位于根目录下的 test 目录中的 text.txt 文件,你要做的是:

/test/text.txt

你也可以这样写上述内容:

test/text.txt

如果你想忽略所有具有特定名称的文件,你需要写出该文件的字面名称。

例如,如果你想忽略任何 text.txt 文件,你可以在 .gitignore 中添加以下内容:

text.txt

在这种情况下,你不需要提供特定文件的完整路径。这种模式将忽略位于项目中任何地方的具有该特定名称的所有文件。

要忽略整个目录及其所有内容,你需要包括目录的名称,并在最后加上斜线 /

test/

这个命令将忽略位于你的项目中任何地方的名为 test 的目录(包括目录中的其他文件和其他子目录)。

需要注意的是,如果你只写一个文件的名字或者只写目录的名字而不写斜线 /,那么这个模式将同时匹配任何带有这个名字的文件或目录:

# 匹配任何名字带有 test 的文件和目录
test

如果你想忽略任何以特定单词开头的文件或目录怎么办?

例如,你想忽略所有名称以 img 开头的文件和目录。要做到这一点,你需要指定你想忽略的名称,后面跟着 * 通配符选择器,像这样:

img*

这个命令将忽略所有名字以 img 开头的文件和目录。

但是,如果你想忽略任何以特定单词结尾的文件或目录呢?

如果你想忽略所有以特定文件扩展名结尾的文件,你需要使用 * 通配符选择器,后面跟你想忽略的文件扩展名。

例如,如果你想忽略所有以 .md 文件扩展名结尾的 markdown 文件,你可以在你的 .gitignore 文件中添加以下内容:

*.md

这个模式将匹配位于项目中任何地方的以 .md 为扩展名的任何文件。

前面,你看到了如何忽略所有以特定后缀结尾的文件。当你想做一个例外,而有一个后缀的文件你不想忽略的时候,会发生什么?

假设你在你的 .gitignore 文件中添加了以下内容:

.md

这个模式会忽略所有以 .md 结尾的文件,但你不希望 Git 忽略一个 README.md 文件。

要做到这一点,你需要使用带有感叹号的否定模式,即 !,来排除一个本来会被忽略的文件:

# 忽略所有 .md 文件
.md

# 不忽略 README.md 文件
!README.md

在 .gitignore 文件中使用这两种模式,所有以 .md 结尾的文件都会被忽略,除了 README.md 文件。

需要记住的是,如果你忽略了整个目录,这个模式就不起作用。

例如,你忽略了所有的 test 目录:

test/

假设在一个 test 文件夹内,你有一个文件,example.md,你不想忽略它。

你不能像这样在一个被忽略的目录内排除一个文件:

# 忽略所有名字带有 test 的目录
test/

# 试图在一个被忽略的目录内排除一个文件是行不通的
!test/example.md

如何忽略以前提交的文件

当你创建一个新的仓库时,最好的做法是创建一个 .gitignore 文件,包含所有你想忽略的文件和不同的文件模式–在提交之前。

Git 只能忽略尚未提交到仓库的未被追踪的文件。

如果你过去已经提交了一个文件,但希望没有提交,会发生什么?

比如你不小心提交了一个存储环境变量的 .env 文件。

你首先需要更新 .gitignore 文件以包括 .env 文件:

# 给 .gitignore 添加 .env 文件
echo ".env" >> .gitignore

现在,你需要告诉 Git 不要追踪这个文件,把它从索引中删除:

git rm --cached .env

git rm 命令,连同 --cached 选项,从版本库中删除文件,但不删除实际的文件。这意味着该文件仍然在你的本地系统和工作目录中作为一个被忽略的文件。

git status 会显示该文件已不在版本库中,而输入 ls 命令会显示该文件存在于你的本地文件系统中。

如果你想从版本库和你的本地系统中删除该文件,省略 --cached 选项。

接下来,用 git add 命令将 .gitignore 添加到暂存区:

git add .gitignore

最后,用 git commit 命令提交 .gitignore 文件:

git commit -m "update ignored files"

总结

你现在知道了在 Git 中忽略文件和文件夹的基本知识。

希望这篇文章对你有所帮助。

想了解更多关于 Git 的信息,请查看以下免费资源:

感谢阅读,happy coding:)

原文链接如下:
https://www.freecodecamp.org/chinese/news/gitignore-file-how-to-ignore-files-and-folders-in-git/

Read more

第六阶段回头看:原来中医的"诊断",从头到尾在做一件事——反查源头

第六阶段回头看:原来中医的"诊断",从头到尾在做一件事——反查源头

写在最前:这是我读《黄帝内经》的学习笔记,不是教学。我读得慢、读得浅,会读错,下面这条把五篇缝在一起的理解,也可能是我的过度解读,欢迎指正——但请不要把我写的任何内容当作就医建议。 阶段小结:回看第六阶段第三十五到第三十九篇,《脉要精微论》《平人气象论》《至真要大论·病机十九条》《热论》《举痛论》。这也是整条主线的收官。 为什么停下来回头看 第六阶段读完了,第三十五到第三十九篇,五篇,主题是"诊法与病机"。 读到这儿,一件大事发生了:主线四十篇,到头了。 从第一篇"法于阴阳"到这一阶段,断断续续读了大半年。所以这一篇回头看,我想看两层:一是第六阶段这五篇讲了什么,二是——读完整条主线,对我这个学渣到底意味着什么。 先说五篇。它们表面上一个讲脉、一个讲正常值、一个讲病机口诀、一个讲发烧、

By Tranmoolee
第三十九篇:痛,多半不是哪里坏了,是哪里堵了——而堵的源头常是情绪

第三十九篇:痛,多半不是哪里坏了,是哪里堵了——而堵的源头常是情绪

写在最前:这是我读《黄帝内经》的学习笔记,不是教学。我读得慢、读得浅,会读错。看到不对的地方欢迎指正——但请不要把我写的任何内容当作就医建议。 今天这段 经脉流行不止,环周不休,寒气入经而稽迟,泣而不行,客于脉外则血少,客于脉中则气不通,故卒然而痛。 余知百病生于气也。怒则气上,喜则气缓,悲则气消,恐则气下,寒则气收,炅则气泄,惊则气乱,劳则气耗,思则气结。 ——《素问·举痛论》 痛是怎么来的:不是"坏了",是"堵了" 主线倒数第二篇,讲一个谁都躲不开的事——痛。 我一直以为,痛 = 哪里坏了、伤了。但这一篇给的解释是另一个字:堵。 经脉流行不止,环周不休,

By Tranmoolee
第三十八篇:发烧原来有剧本——以及为什么刚退烧那顿千万别嘴馋

第三十八篇:发烧原来有剧本——以及为什么刚退烧那顿千万别嘴馋

写在最前:这是我读《黄帝内经》的学习笔记,不是教学。我读得慢、读得浅,会读错。看到不对的地方欢迎指正——但请不要把我写的任何内容当作就医建议。 今天这段 今夫热病者,皆伤寒之类也…… 伤寒一日,巨阳受之,故头项痛,腰脊强。二日阳明受之……三日少阳受之……三阳经络皆受其病,而未入于脏者,故可汗而已。 四日太阴受之……五日少阴受之……六日厥阴受之…… 其未满三日者,可汗而已;其满三日者,可泄而已。 病热少愈,食肉则复,多食则遗,此其禁也。 ——《素问·热论》 先说一件我亲身栽过的事 先讲个糗事。有年冬天我重感冒,烧了两天,第三天觉得好多了,人一轻松,嘴就馋——晚上约了朋友吃火锅,涮肉、喝汤、吃到撑。结果当天半夜,烧又上来了,比之前还难受,多躺了三四天才彻底缓过来。

By Tranmoolee
第三十七篇:一份两千年前的"症状→根源"查找表,但最关键的是末尾那句

第三十七篇:一份两千年前的"症状→根源"查找表,但最关键的是末尾那句

写在最前:这是我读《黄帝内经》的学习笔记,不是教学。我读得慢、读得浅,会读错。看到不对的地方欢迎指正——但请不要把我写的任何内容当作就医建议。 今天这段 诸风掉眩,皆属于肝。诸寒收引,皆属于肾。诸气膹郁,皆属于肺。诸湿肿满,皆属于脾。诸热瞀瘛,皆属于火。诸痛痒疮,皆属于心。诸厥固泄,皆属于下。诸痿喘呕,皆属于上。诸禁鼓栗,如丧神守,皆属于火。诸痉项强,皆属于湿。诸逆冲上,皆属于火。诸胀腹大,皆属于热。诸躁狂越,皆属于火。诸暴强直,皆属于风。诸病有声,鼓之如鼓,皆属于热。诸病胕肿,疼酸惊骇,皆属于火。诸转反戾,水液浑浊,皆属于热。诸病水液,

By Tranmoolee