

















在工作中,常常会容易遇到一台电脑用多个 Git 账号的场景,比如账号 company 账号是工作用的,而账号 personal 是自己个人用的。 由于 Git 本身并没有多账号的机制,导致我们在默认设置下无法很好的区分哪个仓库使用哪个账号。 同时,在某些众所周知的场景下,我们无法直接访问到 Github 仓库,需要走一层 proxy 来加速我们的代码拉取与推送速度, 本文将使用 SSH config 相对优雅的解决这些问题。
Git 通常的鉴权方式有两种: HTTPS 与 SSH,前者通常是在需要鉴权的操作时(如git push),弹出(或是在命令行提示)填写用户名与密码的认证,通过后方可继续执行,这种方式不是很方便的同时,也存在一定的安全隐患,目前已经被 Github 弃用;后者 SSH 方式,通过提前配置好的 SSH 密钥来对 Git 做鉴权,不再需要输入用户名密码,是现在更为推荐的鉴权方式。
如何在 Github 配置 SSH 公钥使用密钥认证,参考:
新增 SSH 密钥到 GitHub 帐户
如何配置 SSH 公钥访问 git 仓库? – CODING 帮助中心
至于代理,在之前的一篇博客 Using a proxy for ssh connections based on netcat 中,我们曾经使用 SSH config来实现对SSH流量的代理。既然 Git 可以通过 SSH 方式进行连接,自然我们也可以使用这种方式来实现代理。
在Alliot的电脑中,存在四个不同的Git账号,一个是个人的Coding账号,一个是个人的GitHub账号,还有一个是公司的GitHub账号,以及一个自建的Gitea账号。Coding仓库可以直连,不需要代理;而GitHub由于众所周知的原因需要代理来加速;自建的Gitea仓库则需要通过个人的隧道来连接到内网。以下是Alliot所用的整体示例配置:
1 |
|
根据上面的配置可以看出,我们使用 Host 字段来配置仓库地址的别名,在命令行拉取或克隆仓库时,可以使用自定义的 Host 来区分不同的 SSH 密钥,这样就能实现如下效果:
当需要使用个人 Github 账号来克隆一个仓库时, 我们可以使用如下命令:
1 | git clone git@alliot.github:AlliotTech/AlliotTech.git |
注意,这里使用 alliot.github 代替了原本的 github.com, 这样所有流量都会代理至本地 7890 端口,并且使用 ~/.ssh/alliot 作为 SSH 密钥来鉴权。
而当需要使用公司帐号的时候,我们可以使用如下的命令:
1 | git clone git@corp.github:AlliotTech/AlliotTech.git |
使用 corp.github 代替了原本的 github.com, 这样就避免了每次都要切换账号的问题。
需要注意的是,目前(2022年) Github 的 SSH 连接方式必须按照 Alliot 这里的配置来(参考Enabling SSH connections over HTTPS) ,即:
1 | Hostname ssh.github.com |
否则可能会遇到类似的错误:
1 | Connection closed by UNKNOWN port 65535 |
经过上述的操作,我们已经解决了多个帐号的鉴权问题, 然而在提交时,我们想要为每个帐号git commit 时的身份配置单独的 user 与 e-mail,这时候我们需要用到 ~/.gitconfig 来配置。
假设我们将仓库路径规划为:
个人: /User/alliot/personal
公司: /User/alliot/company
则 ~/.gitconfig 可以配置如下:
1 |
|
然后分别创建 ~/.gitconfig-company 与 ~/.gitconfig-personal 来配置各自的用户名与邮箱:
1 | [user] |
之后可以去到仓库里面执行如下命令可以检查是否生效:
1 | git config --show-origin --get user.email |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。