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 | /Users/developer/teamA # 根目录 |
解决方案
解决这个问题的方案有很多,下面分享一种使用zsh脚本的方案。首先无论哪一种方案,都需要在全局设置全局git信息:
1 | git config --global user.name "name1" |
安装 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 | # 保证这一行不被注释, 括号的内容可能不一样 |
在 .zshrc
最后,添加 chpwd
函数:
1 | 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 | cd /Users/developer/teamA/projectA |
保险起见,也用git config --local
命令查看一下信息有没有正确设置。
同样,进入/Users/developer/teamB/projectB
:
1 | cd /Users/developer/teamB/projectB |
如果没有输出该消息说明符合预期的
方案限制
必须限制不同的远程仓库放到对应的目录,如果你现在的本地项目已经分散到不同的目录了,就必须要重新移动一下本地目录或者重新clone一下远程仓库到对应目录
总结
通过 Oh My Zsh 的 chpwd
函数,我们能够自动化 Git 用户信息的设置,这不仅提升了工作效率,也减少了配置错误的可能性。本文提供的步骤和测试验证了解决方案的有效性,展示了 Oh My Zsh 在自动化 shell 任务中的实用性。