git commit自动切换Name、Email

前言

在公司使用 GitLab,平时个人使用 Github,git 提交时候附带 user.name,user.email 不同。git 可以通过 –global 设置全局 Name,Email,然后在每个项目中可以指定特定的 Name,Email。但是,每拉一个公司新项目都要单独设置,有点麻烦。所以我考虑配置自动化一下,最好有 hook 在提交时候检测不同的 remote 地址要求相对应的 Name,Email,如果错误就提交失败。

配置

1、根据不同的地址切换不同的 Name,Email

编辑 .gitconfig 文件,将其中 [user] 下内容改为如下,其他内容不变,可以配置多个 includeIf

[user]
    name = aaa

    email = aaaa@aaa.com

    useConfigOnly = true

[includeIf "gitdir:你的项目绝对地址1/**"]

    path = ~/.gitconfig-company

[includeIf "gitdir:你的项目绝对地址2/**"]

    path = ~/.gitconfig-company
    

.gitconfig 同级建一个 .gitconfig-company 文件,内容如下

[user]
    name = bbb
    email = bbbb@bbb.com

大功告成。在不同的文件夹下使用 git config user.name 验证一下。

2、提交时候用 Commit Hook 做校验

执行下面命令

mkdir -p ~/.git-hooks
vim ~/.git-hooks/pre-commit
chmod +x ~/.git-hooks/pre-commit
git config --global core.hooksPath ~/.git-hooks

复制下面内容到刚才的文件内,记得修改文件中的两个邮件地址,或者按照自己的需求修改判断逻辑

#!/bin/sh

email="$(git config user.email)"
remote="$(git remote -v | head -n 1)"

company_email="aaaa@aaa.com"
personal_email="bbbb@bbb.com"

case "$remote" in
  *gitlab* )
    if [ "$email" != "$company_email" ]; then
      echo "❌ 公司仓库必须使用公司邮箱:$company_email"
      echo "当前邮箱:$email"
      exit 1
    fi
    ;;
  *github.com* )
    if [ "$email" != "$personal_email" ]; then
      echo "❌ GitHub 仓库必须使用个人邮箱:$personal_email"
      echo "当前邮箱:$email"
      exit 1
    fi
    ;;
esac

exit 0
2026-05-12