惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
Cloudbric
Cloudbric
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
Intezer
Attack and Defense Labs
Attack and Defense Labs
P
Privacy International News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
Lohrmann on Cybersecurity
C
Cybersecurity and Infrastructure Security Agency CISA
V2EX - 技术
V2EX - 技术
AWS News Blog
AWS News Blog
O
OpenAI News
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
A
Arctic Wolf
Spread Privacy
Spread Privacy
G
GRAHAM CLULEY
T
Tor Project blog
博客园_首页
Know Your Adversary
Know Your Adversary
有赞技术团队
有赞技术团队
S
Secure Thoughts
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
T
Tailwind CSS Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V
Visual Studio Blog
J
Java Code Geeks
Cisco Talos Blog
Cisco Talos Blog
Schneier on Security
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security Affairs
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
宝玉的分享
宝玉的分享
量子位
Last Week in AI
Last Week in AI
月光博客
月光博客
罗磊的独立博客
S
SegmentFault 最新的问题

Alliot's blog

域名切换到blog.alliot.tech Docker 代理配置机制与作用域 Docker 代理配置机制与作用域 2025年底的安卓搞机备忘录 2025年底的安卓搞机备忘录 ArgoCD部署应用出现metadata.annotations过大问题 ArgoCD部署应用出现metadata.annotations过大问题 APC UPS更换电池校准容量 APC UPS更换电池校准容量 M1 Mac安装低版本Node.js M1 Mac安装低版本Node.js Ansible使用Bitwarden存储Vault密码 Ansible使用Bitwarden存储Vault密码 Cloudflare Tunnel前置代理支持 Cloudflare Tunnel前置代理支持 CDN场景下配置Vaultwarden启用fail2ban CDN场景下配置Vaultwarden启用fail2ban 中银香港丝滑开户总结 中银香港丝滑开户总结 从指定路径更新雷池WAF证书 从指定路径更新雷池WAF证书 AWS ECS使用EBS作为Volume AWS ECS使用EBS作为Volume 浅浅的调教一下国产智障电视 浅浅的调教一下国产智障电视 Nginx proxy_pass到AWS ALB的504问题 Nginx proxy_pass到AWS ALB的504问题 OpenV**手动指定路由规则 OpenV**手动指定路由规则 本地模拟CNAME解析 本地模拟CNAME解析 Nginx搭建WebDAV服务 Nginx搭建WebDAV服务 迎来船新版本的Hexo+NexT 迎来船新版本的Hexo+NexT 优雅的处理Git多帐号与代理问题 验光配镜扫盲 验光配镜扫盲 Prometheus relabel实现动态metrics path Prometheus relabel实现动态metrics path
优雅的处理Git多帐号与代理问题
Alliot · 2023-08-06 · via Alliot's blog

  在工作中,常常会容易遇到一台电脑用多个 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47




Host e.coding.net
Hostname e.coding.net
User git


IdentityFile ~/.ssh/coding


Host github.com
Hostname ssh.github.com
Port 443
User git

IdentityFile ~/.ssh/alliot


ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:7890 %h %p


Host alliot.github
Hostname ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/alliot

ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:7890 %h %p


Host corp.github
Hostname ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/company
ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:7890 %h %p


Host git.local
Hostname 192.168.1.123
User git
IdentitAyFile ~/.ssh/key
ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:7890 %h %p
Port 22
ForwardAgent yes

  根据上面的配置可以看出,我们使用 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
2
3
Hostname ssh.github.com
Port 443
User git

否则可能会遇到类似的错误:

1
2
3
4
Connection closed by UNKNOWN port 65535
致命错误:无法读取远程仓库。

请确认您有正确的访问权限并且仓库存在。

多帐号身份问题

  经过上述的操作,我们已经解决了多个帐号的鉴权问题, 然而在提交时,我们想要为每个帐号git commit 时的身份配置单独的 user 与 e-mail,这时候我们需要用到 ~/.gitconfig 来配置。
  假设我们将仓库路径规划为:
个人: /User/alliot/personal
公司: /User/alliot/company
~/.gitconfig 可以配置如下:

1
2
3
4
5
6
7
8
9
10
11

[user]
name = You
email = anonymous@example.com


[includeIf "gitdir:/Users/alliot/company/"]
path = ~/.gitconfig-company

[includeIf "gitdir:/Users/alliot/personal"]
path = ~/.gitconfig-personal

  然后分别创建 ~/.gitconfig-company~/.gitconfig-personal 来配置各自的用户名与邮箱:

1
2
3
[user]
name = alliot
email = my@example.com

  之后可以去到仓库里面执行如下命令可以检查是否生效:

1
git config --show-origin --get user.email

拓展阅读

SSH config file for OpenSSH client