一机多Git账号(gitee、github、gitlab)的SSH免密配置

业余杂谈 herman 432浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:codedq,之前的微信号好友位已满,备注:返现
饿了么大量招人,我内推!Java 方向!薪资不设上限,工作年龄不限!工作地点限魔都,可电话面试!简历,发我微信:codedq
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

一个程序员,通常拥有多个开源平台的账号。比如:github、gitee、gitlab 等。多个账号就会带来管理上的一些麻烦。尤其是我们可能需要记住多个账号和密码。这个时候,最推荐的做法就是配置 SSH 的免密登录。

如果是一个账号的话,我相信大多数人都会配置。但是如果是多个账号的话,改如何的在一台电脑上进行无缝的切换呢?今天我给大家阐述一些我的个人使用心得。

Git 账号和 GitHub/GitLab 账号

Git 中其实是没有账号概念的。Git 是高质量的版本控制系统,GitHub 是云端代码托管平台。下图就是它们之间的一些区别:

Git VS Github

Git 账号

前面已经说过了,在 Git 中其实是不存在账号的概念的,即没有登录、鉴权等步骤,只有一个全局和本地的配置,能够设置 user.name 和 user.email 用于标识提交者信息。假如说你刚安装 Git,首次提交代码的时候会有如下提示:

Your name and email address were configured automatically based on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

就是说你还没有设置提交者信息,全局和本地项目都没有设置,全局的配置在文件:~/.gitconfig 中,项目的配置在 .git/config 中,如果都没有的话,Git 就会获取操作系统用户信息作为提交人信息,例如在 Mac 中,获取方式为 用户全名 <用户名@主机名>,其中:

  • 用户全名用 id -F 获取
  • 用户名用 id -un 获取
  • 主机名用 hostname 获取

所以,如果你不设置提交人信息的话,电脑信息就暴露了,所以建议大家根据上面的提示进行设置。

GitHub/GitLab 账号

这两个账号不用说了,就是登录网站注册得到的,但是注册之后有一个很重要的步骤就是配置 SSH Key,如果不配置的话,网站无法对提交人进行鉴权,因此就无法提交到仓库中。首先要在电脑上生成 SSH Key,生成方法很简单:

ssh-keygen -t rsa -C "www.xttblog.com"

运行之后,在 ~/.ssh 目录下会多出两个文件:

-rw-------@ 1 xttblog  codedq   1.6K 12 16  2020 id_rsa
-rw-r--r--@ 1 xttblog  codedq   416B 12 16  2020 id_rsa.pub

其中 id_rsa.pub 就是公钥,通过 cat ~/.ssh/id_rsa.pub 获取其内容,复制到 GitHub 或 GitLab 账户的 SSH Key 里面即可,下次再提交的话就能通过了。

如果上面这个步骤还有不懂的,可以参考我的这篇文章《手把手教你使用 ssh-key 免密登录各云服务器和Github》。

多账号操作步骤

Git 多账号

在一个项目中,用下面的命令修改用户名和邮箱即可:

git config user.name xxx
git config user.email xxx

这样的话,就相当于设置了一个新的 Git 账号了,但是要注意,这里的邮箱比较重要,在提交到 GitHub/GitLab 网站的时候,会根据这里设置邮箱(即 user.email)与 GitHub/GitLab 账号中的邮箱进行匹配,如果匹配上了,commit 中的用户名和头像就会 GitHub/GitLab 账号的用户名和头像,如果没匹配上,commit 中的用户名就用 user.name。

GitHub/GitLab/gitee 多账号

这才是本文的重点,如何给托管平台 GitHub/GitLab/gitee 配置多账号。上面已经知道代码托管平台实际上是通过 ~/.ssh/id_rsa.pub 来认证用户的,所以只要多生成几个密钥对就相当于生成了多个托管平台的账号了!注意,生成密钥对之后,记得添加到 GitHub 或 GitLab、Gitee 账户的 SSH Key 里面。
但是生成密钥对的时候不要覆盖之前的密钥对,因为默认会保存到同样的位置,即 ~/.ssh/id_rsa,如果没备份的话,千万不要覆盖,不然就找不到了!(真覆盖了话,也不是什么大事,把原 SSH Key 从托管平台里面删了即可),例如你可以先保存到当前目录下,然后移动到其他位置,例如 ~/.ssh/xttblog/ 目录:

$ ssh-keygen -t rsa -C "taoge"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xtt/.ssh/id_rsa): ./id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./id_rsa.
Your public key has been saved in ./id_rsa.pub

到这里,你就拥有多个 SSH Key 了,于是可以通过下面的命令切换身份:

# 默认就是用的 ~/.ssh/id_rsa,所以加不加一个效果
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa" git clone xxxx
# 使用另外一个私钥
GIT_SSH_COMMAND="ssh -i  ~/.ssh/xttblog/id_rsa" git push
# 使用 gitlab 的私钥,当然你得把对应的公钥添加到 gitlab 的 SSH Key 里面才行
GIT_SSH_COMMAND="ssh -i  ~/.ssh/gitlab/id_rsa" git push

这种方式虽然灵活,但是不够智能,例如我想要的效果就是:某个平台的所有仓库都使用某个私钥进行认证,这种需求很常见,打开 ~/git/config 文件配置如下:

Host github.com
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github/id_rsa
Host gitlab.com
    Hostname gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitlab/id_rsa
Host gitee.com
    Hostname gitee.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitee/id_rsa

到这里,多账号的配置基本上已经完成了,但是还有一个不足的地方就是虽然私钥根据域名自动选择了,但是提交的配置还是共享 .gitconfig 中的配置,例如 user.name 和 user.email,能不能根据仓库所在的不同位置选择不同的全局配置文件呢? 答案是可以的,打开 ~/.gitconfig 文件,在末尾添加下面的配置:

[includeIf "gitdir:~/work/gitlab/"]
    path = .gitconfig-gitlab

然后再建一个 ~/.gitconfig-gitlab 文件,里面写全局配置,例如:

[user]
    name = xttblog
    email = xttblog

那么只要仓库被放到了 ~/work/gitlab 目录下面,默认就会使用这个配置了!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:xttblog(5000人已满),微信号3:codedq(超3800)。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 一机多Git账号(gitee、github、gitlab)的SSH免密配置