Oh My Zsh 自动化:轻松管理多个 Git 用户身份信息

在 Git 工作流中,有时需要在同一台电脑上针对不同的项目设置不同的用户身份。例如,开发人员可能需要在个人项目和公司项目之间切换,而这两个项目可能需要不同的 Git 用户名和电子邮件地址。Oh My Zsh 提供了强大的自定义功能,允许我们通过编写自定义的 shell 函数来实现这一需求。本文将展示如何使用 Oh My Zsh 的 chpwd 函数来自动设置特定目录及其子目录、孙目录下的 Git 用户配置。

开始之前

假设你对git身份信息和ssh key概念有比较清晰的认识和了解其基础使用,比如git身份信息是用户名和邮箱,在你使用git commit的时候进行记录;而ssh key是一个凭证(分为公钥和私钥),用于远端身份信息验证,和git没有直接关系,也可以用于其他场景使用,比如ssh登录远程主机。

简单说下为什么要使用不同的git身份信息呢?
公司项目要求使用规定的name(比如企微名,花名或者公司内部系统的唯一标识等)和email(公司邮箱)作为git提交记录,这样方便团队协作和代码管理,这些信息有一定的敏感性。所有在提交代码到外网的时候必须考虑使用不同的git身份信息来提交。

当然我们可以在每次克隆一个新项目的时候,根据不同需要使用git config –local进行设置,但这明手动操作容易遗忘而且繁琐,所以想到使用脚本来自动化完成。

最终效果

本文不是解决:不同的远程仓库(比如github和gitee,公司自建的gitlab等)使用不同的ssh key凭证这个问题,而且为了解决以下问题:

  • 不同的远程仓库(比如github和gitee,公司自建的gitlab等)使用不同的git身份信息

最终想达到:

  • 进入到指定目录及其子目录,孙目录,如果是git仓库,就自动设置对应的git身份信息

约定目录结构:

1
2
3
4
5
/Users/developer/teamA         # 根目录
└── projectA # 子目录,团队项目
└── src # 孙目录

/Users/developer/teamB

解决方案

解决这个问题的方案有很多,下面分享一种使用zsh脚本的方案。首先无论哪一种方案,都需要在全局设置全局git信息:

1
2
git config --global user.name "name1"
git config --global user.email"email1@email.com"

安装 Oh My Zsh

如果尚未安装,通过以下命令安装(已经安装就跳过):

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

编辑 .zshrc 文件

添加 chpwd 函数:在 .zshrc 最后添加以下函数

1
vi ~/.zshrc

确保启用了plugin:

1
2
# 保证这一行不被注释, 括号的内容可能不一样
plugins=(git)

.zshrc 最后,添加 chpwd 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 chpwd() {
# 指定目标目录
local root_dir="/Users/developer/teamA" # 指定目录
# 指定该目录要设置的git name信息
local user_name="name"
# 指定该目录要设置的git email信息
local user_email="email@email.com"
# 获取到当前目录
local current_dir="$(pwd -P)"
# 如果当前目录是否是目标目录,或者是否其子目录,孙目录
if [[ "$current_dir" == "$root_dir"* ]]; then
# 输出当前目录,用于调试,后续可删除
echo "chpwd: $PWD"

if [ -d "$current_dir/.git" ]; then
git -C "$current_dir" config --local user.name "$user_name"
git -C "$current_dir" config --local user.email "$user_email"
echo "chpwd: 成功设置 user.name 和 user.email"
fi
fi
}
# 执行 chpwd 函数
chpwd

为了让更改生效,需要重新加载 .zshrc 文件。在终端中运行以下命令(或者关闭后重新打开)

1
source ~/.zshrc

ps: 当然你如果使用的其他命令行终端,可以参考这个脚本,根据终端的特点,自行配置

测试

在vscode中打开控制台:

使用vscode打开项目/Users/developer/teamA/projectA,并且打开控制台,如果发现有成功输出信息,就表示成功了。

1
chpwd: 成功设置 user.name 和 user.email

保险起见,也用git config --local命令查看一下信息有没有正确设置。如果输出的信息是你预期的表示脚本成功了。

同样,使用vscode打开一个不在/Users/developer/teamA目录下的项目,如果没有输出该消息说明符合预期的

测试cd命令

打开zsh终端,使用cd命令进入/Users/developer/teamA/projectA,如果发现有成功输出信息,就表示成功了。

1
2
3
cd /Users/developer/teamA/projectA

chpwd: 成功设置 user.name 和 user.email

保险起见,也用git config --local命令查看一下信息有没有正确设置。

同样,进入/Users/developer/teamB/projectB:

1
cd /Users/developer/teamB/projectB

如果没有输出该消息说明符合预期的

方案限制

必须限制不同的远程仓库放到对应的目录,如果你现在的本地项目已经分散到不同的目录了,就必须要重新移动一下本地目录或者重新clone一下远程仓库到对应目录

总结

通过 Oh My Zsh 的 chpwd 函数,我们能够自动化 Git 用户信息的设置,这不仅提升了工作效率,也减少了配置错误的可能性。本文提供的步骤和测试验证了解决方案的有效性,展示了 Oh My Zsh 在自动化 shell 任务中的实用性。