227. 多个 GIT 账户共存并支持推送仓库
平时开发过程中可能遇到这样的问题,就是在进行公司的项目开发时要用公司的 git 账号,以及对应的 git 仓库,比如 gitlab 的;对于个人的开源项目,又会有自己的 git 账号,以及对应的 git 仓库,比如 github 或者码云(gitee)。
这时就会遇到多账户提交时的冲突问题,以及对应的多个 ssh key 的管理的问题。
先验知识
- 查看所有配置及其来源:
git config [--global] --list --show-origin
- 检查配置:
git config [--global] --get <credential.helper>
[!NOTE]
如果命令配置后无效,请使用git config [--global] --list --show-origin
查看所在文件,直接修改文件也可以达到同样的目的. (万物皆文件)
实现
多个 ssh key 的管理
ssh key 的创建
假如有两个 git 账户,分别是 github@example.com
和 gitee@example.com
。为了提交 git,我们需要设置对应的 ssh key,ssh key 具体其在对应平台的配置方法比较简单,本文不再详述,可参考对应的资料,这里只是 ssh key 的创建及管理。
在终端输入如下命令:
1 | ssh-keygen -t rsa -C "github@example.com" |
终端提示如下:
1 | Generating public/private rsa key pair. |
此时直接回车,就会在 ~/.ssh/
路径下,创建一个名为 id_rsa
的公钥,这个并不是我们想要的,因为这里要设计多个 ssh key 的管理,这个命名没有任何特征。
在终端中输入如下命令:
1 | /Users/XXX/.ssh/id_rsa_github |
表示这个是 github 平台的 key,之后根据终端提示,输入并确认密码,就可以生成了。
1 | Enter passphrase (empty for no passphrase): |
同理,另一个 ssh key 的创建流程如下:
1 | ssh-keygen -t rsa -C "gitee@example.com" |
配置 ssh 代理
创建好了上面的多个 ssh key 就可以开始管理他们了。
在终端中输入如下命令,查询系统 ssh key 的代理:
1 | ssh-add -l |
如果系统已经设置了代理,需要删除:
1 | ssh-add -D |
如果提示:
1 | # Could not open a connection to your authentication agent. |
执行:
1 | exec ssh-agent bash |
接下来添加刚才创建的 ssh key 的私钥:
1 | # 第一个 |
添加公钥
其实就是将对应的.pub 中的内容,复制到对应平台的 ssh key 管理栏目中,不同的平台,位置不同,可以去对应的个人中心的设置中查看,很容易找到。
配置文件 config
在 /.ssh 目录下创建 config 配置文件:
1 | vim ~/.ssh/config |
熟悉 vim 的可以直接在终端中编辑这个 config 文件,不熟悉的,打开指定目录下新创建的 config 文件,直接文本编辑即可:
1 | # github配置 |
编辑保存后,再次查看 ssh key 的代理:
1 | ssh-add -l |
如果看到如下,说明设置成功了:
1 | 2048 SHA256:............ /Users/XXX/.ssh/id_rsa_github (RSA) |
验证 ssh key
终端中输入如下验证命令,如果返回如下,说明配置成功了:
1 | ssh -T git@github.com |
如果遇到:
1 | permission denied (publickey) |
就是之前的公钥设置的问题,需要去对应的平台检查下 ssh key 公钥是否设置成功。
至此,ssh key 的配置管理就结束了。
多个 git 账户的提交问题
我们大多数人都会使用第三方工具进行 git 提交,比如 source tree 之类的,这些工具在提交时,如果不对对应的 git 仓库进行专门的配置,会默认走 git 的全局配置,也就是会用默认的全局配置的账户进行 git 提交。一不小心,就会用我们私人的账户,进行了公司项目的 git 提交,生成了对应的提交记录,也有可能因为权限问题,导致直接提交失败。
这时,我们需要对不同的仓库,进行对应的配置。
检查全局配置
在终端中,分别输入如下命令,可以检查目前电脑中的 git 的全局配置信息,如果没有返回,说明没有全局配置,如果有,就可以看到对应的默认的账户是那个了。
1 | git config --global user.name |
为了避免麻烦,我们可以取消全局配置:
1 | git config --global --unset user.name |
全局配置和局部配置
此时已经取消了电脑中默认的 git 全局配置信息,此时进行 git 提交,会报对应的找不到账户信息的错误。
我们可以 cd 到对应的 git 仓库的根目录下,执行局部 git 配置命令。比如 /Users/XXX/github/DemoProject
是一个在 github 平台托管的本地 git 仓库的根目录,我们可以执行如下命令:
1 | cd /Users/XXX/github/DemoProject |
如果返回均为空,说明没有进行过局部配置,可以分别配置 github 的账户名和邮箱:
1 | git config user.name "github账户名" |
同理,在不同的 git 仓库下,可以分别配置不同平台的 git 账户名和 git 邮箱。这虽然看起来麻烦,不过,只要设置完成,之后只要不再更改对应的 git 仓库的路径,就不需要再更换配置了。
而且,即便我们没有取消默认的全局 git 配置,在进行了局部配置后,后者的优先级会更高。 执行:
1 | git config --list |
可以查看查看当前仓库的具体配置信息,在当前仓库目录下查看的配置是全局配置 + 当前项目的局部配置,使用的时候会优先使用当前仓库的局部配置,如果没有,才会去读取全局配置。
hexo 部署时的 git 提交问题
因为我们先前取消了电脑中的 git 全局配置,hexo 在部署发布时,可能遇到如下问题:
1 | *** Please tell me who you are. |
不知道是不是因为 hexo 必须要求读取全局配置,设置了几个文件夹的局部 git 配置,均无效,只好又恢复了全局配置,也就是对应的 github 的账户信息,因为之前提到过,局部配置的优先级大于全局配置,所以不用担心账户冲突的问题,只要设置好对应仓库的局部配置信息,就不用担心全局配置的存在。
当然,这只是折中的方案,如果有人知道如何配置 hexo 仓库的局部配置信息,欢迎指教。
globa 基于 https 管理多个账户的私有仓库
添加 github 账户的 SSH keys
新建 github 账户的 token
按照上面的教程配置多个账户的 ssh key
使用命令:
git clone git@<user_hostname>:<repository_owner>/<repository_name>.git
下载该仓库使用命令设置 local 配置
1
2
3
4
5git config --local user.name <username> # 设置用户名
git config --local user.email <usermail> # 设置用户邮箱
git config --local credential.helper store # 设置存储密钥
git remote rm origin # 移除远程链接
git remote add origin <remote_url> # 添加仓库的url大功告成
QAs
如果存在无法上传到仓库的问题
运行命令:
1
2git config --global --unset user.name
git config --global --unset user.emailYour name and email address were configured automatically based on your username and hostname. Please check that they are accurate.
你可以运行命令
1
2git config --local user.name "Your Name"
git config --local user.email you@example.com但是该命令需要在每个仓库都要运行一遍。如果想一劳永逸,那么运行命令:
1
2git config --global user.name "Your Name"
git config --global user.email you@example.com