对于同时在写开源项目和公司私有项目的码农,不同的项目可能就需要选择不同的邮箱。
最直接的方案是给每个 repo 设置一遍,毕竟 Git 自带了 --local
--global
--system
三个级别的设置。我之前的办法就是 global
写个人邮箱,然后写一个脚本用于设置当前项目的邮箱为公司邮箱(大概如下),放在 PATH 下,每新建 / clone 一个 repo 的时候跑一遍。
# git-init.sh or git-init.ps1
git config --local user.email your.work@company.com
git config --local user.name "Your Name"
当然,坏处也是十分显然的,每个公司项目都得设置一遍,很容易忘记。于是就有了这篇博客。
Git 对于这种“根据路径设置邮箱名”的需求,在 git config
里提供了 IncludeIf
参数 (opens new window)(似乎大小写不敏感)。
# ~/.gitconfig
[user]
email = lyh543@outlook.com
name = lyh543
[includeIf "gitdir:bitme/"] # 路径必须以短横线结尾
path = .bitme.gitconfig
[pull]
rebase = true
[diff]
submodule = log
[init]
defaultbranch = master
[http]
proxy = http://127.0.0.1:17296
[https]
proxy = http://127.0.0.1:17296
[core]
editor = code --wait
autocrlf = input
上面这段 includeIf
的意思是,如果当前 repo 路径包含 bitme/
,就读取 .bitme.gitconfig
(也可以叫其他名字)并进行设置。注意对相同项的重复设置,以最后一次为准。
然后我们再写一个 ~/.bitme.gitconfig
:
# ~/.bitme.gitconfig
[user]
email = email@bitme.fun
name = Yanhui Liu
就可以一劳永逸了。
但是还没有完全一劳永逸,按照这个写法,每次得写两个 .gitconfig
,而且这个格式还是有点麻烦。
但是万能的 Git 想到了这一点!
阅读文档可以发现,git config
除了 --system
--global
--local
以外,还支持 --file
参数,可以指定一个文件来 读/写 配置。那直接把上面的代码变成脚本就 ok 了。
# git-init.sh or git-init.ps1
git config --global user.email lyh543@outlook.com
git config --global user.name lyh543
git config --global includeif.gitdir:bitme/.path .bitme.gitconfig
git config --global pull.rebase true
git config --global diff.submodule log
git config --global init.defaultbranch master
git config --global http.proxy http://127.0.0.1:17296
git config --global https.proxy http://127.0.0.1:17296
git config --global core.editor code --wait
git config --global core.autocrlf input
git config --file .bitme.gitconfig user.email email@bitme.fun
git config --file .bitme.gitconfig user.name Yanhui Liu
最后就是脚本怎么办了。你可以尝试维护一个 repo 专门放各种脚本(公有、私有随意)。每次换新电脑 / 重装系统,挂完梯子第一件事就是把仓库 clone 下来,然后加到 PATH 里。