guide

用 .git/info/exclude 编写只属于自己的忽略规则

说明如何在不修改 .gitignore 的情况下,把只作用于单个仓库的个人忽略规则写入 .git/info/exclude,以及适用场景和优先级。

.gitignore 会被提交并与所有人共享。但有时会有只想在这个仓库中由自己忽略的文件,比如个人笔记、实验脚本、自己的编辑器插件生成的目录等。这时使用的地方就是 .git/info/exclude

位置在哪里

执行 git initgit clone 后,会默认创建 .git/info/exclude 文件。它是一个只有几行注释的空文件。

cat .git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# ...

它位于 .git 目录中,因此不会被提交,push 后也不会传给其他人。 语法与 .gitignore 完全相同。如果想知道确切位置(包括使用多个工作树的情况),可以用 git rev-parse --git-path info/exclude 查看。

什么时候使用

场景示例推荐位置
只在这个仓库中使用的个人文件notes.md, scratch/, todo.txt.git/info/exclude
所有仓库通用的个人文件.DS_Store, *.swp全局 gitignore
所有团队成员都需要的规则node_modules/, dist/, .env.gitignore

为他人的仓库做贡献时尤其有用。如果为了拦截自己工具产生的文件而修改项目的 .gitignore,审阅者可能并不希望有这样的改动。写进 .git/info/exclude 就不会触及提交历史。

echo 'scratch/' >> .git/info/exclude
echo '.my-plugin-cache/' >> .git/info/exclude
git status   # 不再显示

优先级

在各种规则来源中,.git/info/exclude 的优先级低于 .gitignore高于全局文件。

  1. 命令行模式
  2. .gitignore (下层目录的文件覆盖上层)
  3. .git/info/exclude
  4. core.excludesFile

因此,无法用 .git/info/exclude 中的 ! 规则恢复被 .gitignore 忽略的文件。实际验证结果如下。

# .gitignore        : x
# .git/info/exclude : !x
$ git check-ignore -v x
.gitignore:1:x	x

注意事项

参考

← 上一篇设置全局 gitignore (core.excludesFile)