使用有条件的 .gitconfig

如果你是一个 Git 重度依赖患者,这篇文章会告诉你如何避免提交错误的 email 给某个 repo 的 commit。
让我们彻底区分开工作与生活。

No more accidentally committing with the wrong email in a new repository

Scenario

在使用 Git 工具之前,我们会预先设置一个全局的 git emailusername,这个可能是你的私人邮箱或者是工作邮箱。但是你只能选择一个来设置。

1
2
git config email --global <your.email>
git config username --global <your.username>

但如果你生活和工作使用同一台电脑工作,经常会有这样的事情,创建一个新的 repo, 这个 repo 可能是工作需要,但是你的 Git 原先的设置是私人邮箱,这个时候,会出现两种情况:

  • 你忘记了这件事情,你会使用全局配置提交 commit, 之后就会发现 commit 的提交上会出现你的私人邮箱,这是不专业的。
  • 你想起来了这件事情,所以你会使用 git config email <your.work.email> 去修改当前 repo config 设置。

那是不是会有更灵活的方式呢?

One solution

Git 2.13 以上的版本,.gitconfig 支持 Conditional Includes 的语法,可以使用 includeIf.<condition>.path 的语法在特定的条件下复写 global 的配置。

如果我们对自己的电脑整理妥当,那么我们经常会将工作放在一个特定的文件夹下面,例如 ~/works。这样我们可以针对这个特定的文件夹,创建一个包含特定 email 的 .gitconfig。那到底要怎么配置呢?

  1. 创建一个特定的 .gitConfig

    首先,我们需要创建一个 .gitconfig 文件适用于 ~/works 文件夹,这个文件放置的位置并不重要,你可以选择放置在 HOME path, 也可以选择放置在 ~/works 文件夹下面。

    按照我的习惯,我将它放置在 HOME path, 起名为 .gitConfig-work, 并写入想要被复习的配置:

    1
    2
    3
    [user]
    name = <your.name>
    email = <your.work.email>
  2. ~/works文件夹设置conditional includes

    接下来,我们需要在 gloabl .gitconfig 文件里,追加一些配置来告诉 Git,当我们工作在 ~/works 文件夹下面的时候,应该使用 .gitconfig-work 的配置项。

    1
    2
    [includeIf "gitdir:~/works/"]
    path = ~/.gitconfig-work

    这个配置表明当你工作的位置处于 ~/works 文件夹下面的时候,.gitconfig-work 的配置项会复写 .gitconfig 中的配置,这时,当你在 ~/works 文件夹下面创建新的 repo 并发生提交时,你可以看到 email 会默认变成工作邮箱。

以上的两步,就可以帮助你解决工作时提交错误邮箱的尴尬事情!

End

当然,强大的 Git 还有更多的功能等待我们学习。includeIf 不仅仅只有一个参数 gitdir, 还包括 gitdir/i 关键字来进行匹配。

更多的配置,希望大家查看 git config

Reference