作为一名 Git 用户,你肯定遇到过“git ignore”,但你是否也了解“git exclude”呢?从互联网搜索、社区看,这个实用功能似乎并不像人们想象的那样广为人知。
本文将解释和说明什么是 git exclude,它与 git ignore 的区别,以及在什么时候以及什么场景下该使用哪一个。
git exclude 究竟是什么?
exclude,意为“排除”,类似于忽略(ignore),是一种告诉 Git 不要跟踪存储库中某个文件的方法。
这两个功能在使用上几乎完全相同,甚至在官方的 gitignore 文档中也共享同一个页面。
所以,如果你理解了其中一项规则,你就能自然理解另一项规则。
排除 exclude 和忽略 ignore 的区别
这些特征之间的两个主要区别在于:
- 文件位置:文件存储在不同的位置。
- 文件跟踪: git 不会跟踪排除的文件。
虽然你可以像厨师在菜谱中“加一小撮盐”一样,将 .gitignore 文件散布在整个存储库中,但实际上只有一个排除文件。
注:本站提供了 .gitignore 文件一键生成工具,生成不同项目的 .gitignore 文件十分方便。
排除文件位于.git大多数编辑器默认隐藏的目录中。更准确地说,它位于此处:
my-repository/.git/info/exclude实际上,你很可能在那里找到它,因为克隆仓库后,该目录和文件很可能并不存在。幸运的是,你可以像创建其他任何项目一样创建它们。
是的,默认情况下此文件可能不存在,因为 git 不会跟踪它;它只是一个对您而言的忽略文件,并且仅在您检出的存储库中有效。
因此,如果您在同一台机器上克隆同一个存储库三次,然后将同一个文件添加到每个存储库中,并且只在三个存储库中的一个存储库中排除该文件,您仍然会在另外两个存储库中看到该文件。
git exclude 有什么用?
排除文件的实用性显然不在于它的可见性,但它仍然非常强大。
当您想将个人、非标准文件保留在不属于您的存储库中,并且您不能随意更新其忽略文件时,排除功能尤其方便。
我曾用它来做以下一些事情:
- 个人脚本和脚本文件(例如:Makefile、Taskfile、Justfile 等)
- 临时代码以及更多类似的随机实验性内容
- 一个名为 的 Django 管理命令 xxx_marijke,用于在常规 Python 模块无法满足需求时使用
- 一个 Docker Compose 覆盖文件,后来有人把它添加到了项目的主忽略文件中(它本来就应该在那里)
全局 .gitignore 文件
全局 gitignore 文件是一个位于文件系统中某个位置的单个文件,在 git 配置中被视为全局配置文件。
我只对那些我不想在每个仓库中单独排除的特定于机器的条目使用全局忽略。这通常是编辑器或扩展程序特有的文件,它们过于小众,不适合使用常规的忽略文件。
现在,我更倾向于在项目中使用 gitignore.org 上的初始模板,而不是扩展全局文件。不过,全局文件仍然有用,如果需要的话,我建议还是设置一个。
友情提示:
请谨慎使用全局忽略文件功能。
这种情况并非首次发生:有人误将某个文件添加到仓库中,而其他人却忘记将其添加到项目忽略文件中,因为他们已经在全局忽略文件中添加了该文件。
何时使用 git exclude 和 git ignore?
综上所述,我们探讨了从 Git 仓库中省略文件的三种方法:
- git 仓库的排除文件;
- 任意项目 git 忽略文件;
- 全局 Git 忽略文件。
您可以对所有项目使用这三种方法的组合,并确定哪一种最适合您要从存储库中删除的文件。
首先关注项目级别的忽略文件,原因有二:
- 它适用于参与该项目的每个人,防止意外签入不需要的文件。
- 与其他两个文件不同,当您打开项目目录时,您将在代码编辑器中看到这些文件。
至于排除文件和全局忽略文件,这更多取决于个人喜好。
我通常将临时项目特定文件放在排除列表中,将代码编辑器相关文件放在全局列表中。
一旦我开始在多个存储库中排除同一个文件,就该考虑使用全局忽略文件了。
我还强烈建议您查找特定语言的忽略文件的初始模板;这些模板通常已经包含您和您的团队将来可能需要的许多条目。
总结
每次我向别人提起 git exclude 的存在时,都会得到“今天才知道”这样的回应,这让我感到惊讶。
话又说回来,需要学习的东西太多了,我知道还有很多我不知道的,也许永远也不会知道。
不过,git exclude 仍然是你需要了解的功能之一,我希望你会喜欢这个新工具。
感谢阅读,希望对你有帮助。

