Git 文件忽略:使用 .gitignore、.git/info/exclude 与全局忽略文件
Git 允许用户在三个不同层级上忽略文件:项目层级、仓库本地层级和用户全局层级。这种分层方式使开发者能够将共享的项目需求与个人工作流偏好以及机器特定的操作系统噪声分离开来。
使用 .gitignore 的项目层级忽略
.gitignore 是将文件排除在仓库之外的标准方法,适用于所有贡献者。由于该文件会被提交到版本控制,任何添加的模式都会对克隆仓库的每个人生效。
该文件最适合用于:
- 构建产出(例如
/dist、/bin) - 依赖文件夹(例如
node_modules/) - 项目特定的临时文件
使用 .git/info/exclude 的仓库本地忽略
对于需要在特定仓库中忽略但不应与其他协作者共享的文件,Git 提供了 .git/info/exclude 文件。该文件位于 .git 目录内部,不受版本控制。
这里是放置个人笔记、仅本地使用的脚本或自定义 Makefile(这些文件只在单个项目的特定开发者工作流中唯一)的理想位置。正如一位贡献者所说:
我大量使用 .git/info/exclude。对我只想本地使用且协作者不关心或无法使用的脚本/Makefile 非常有效。
使用 ~/.config/git/ignore 的用户全局忽略
要在一台机器上的所有 Git 仓库中忽略文件,开发者可以使用全局忽略文件。默认情况下,该文件位于 ~/.config/git/ignore。
全局忽略最适合用于操作系统特定的文件或 IDE 配置,这类文件会出现在每个项目中,例如 macOS 上的 .DS_Store。使用全局忽略可以防止这些文件占用项目层级的 .gitignore。
自定义全局忽略文件路径
如果希望使用除默认位置之外的路径,可以通过以下命令自定义全局忽略文件:
git config --global core.excludesFile ~/.gitignore_global
要恢复默认设置,运行:
git config --global --unset core.excludesFile
请注意,在 Git 术语中,--global 指的是当前用户的配置,而不是整个系统。系统范围的配置通常位于 /etc。
使用 git check-ignore 调试被忽略的文件
当多个忽略文件同时生效时,往往难以判断是哪一个导致了特定文件被排除。git check-ignore -v 命令可以定位具体的文件和行号。
示例输出:
- 项目层级:
.gitignore:1:.DS_Store .DS_Store - 本地层级:
.git/info/exclude:7:.DS_Store .DS_Store - 全局层级:
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
如果文件没有被忽略,命令将不产生任何输出。
高级替代方案与补充
除了标准的忽略功能,Git 还提供其他工具来管理文件噪声和配置:
使用 .gitattributes 抑制差异
虽然 .gitignore 能阻止文件被跟踪,.gitattributes 则可以忽略已跟踪文件的 diff。例如,在 .gitattributes 中添加 package-lock.json -diff,即可在提交文件的同时隐藏其在 git diff 时产生的大量、常常噪声的差异。
远程特定的配置
Git 支持在配置文件中使用条件包含,根据远程 URL 或仓库所在目录加载不同的设置。这对于在工作项目和个人项目之间管理不同的电子邮件地址或其他配置非常有用。
用预提交钩子拦截二进制文件
为了阻止二进制文件或超过特定大小的文件,一些开发者建议使用全局钩子目录(git config --global core.hooksPath ~/.config/git/hooks)来实现预提交检查,而不是仅依赖忽略文件。
摘要:Git 提供了三种不同层级的文件忽略方式——项目层级(.gitignore)、仓库本地层级(.git/info/exclude)和用户全局层级(~/.config/git/ignore)——帮助在不污染共享配置的前提下管理未跟踪文件。
标题:Git 文件忽略:使用 .gitignore、.git/info/exclude 与全局忽略文件