如果在 Github 有多个账号,比如同时有个人账号以及多个组织账号(organization),开发过程中难免需要切换身份,这篇文章介绍解决此场景下遇到的问题。
这里我们假设处理场景:
- 个人账户对应的仓库是 personal_repo
- 组织账户对应的仓库是 organization_resp
最终目的: 自动识别对应仓库的用户身份,并正确的 pull & push 仓库代码。
注意,本文中带有大括号符号是需要自行命名替换的变量或者文件。
配置 SSH
配置不同身份登录 github 时使用的登录认证信息。如果两个 repo 在不同的站点,那直接配置即可,但是当前场景不同的身份都是登录 github,为了进行区分,需要通过给 github 起别名的方式来让两种身份进行区分。
生成 SSH 公钥私钥:
ssh-keygen -f {personal}
ssh-keygen -f {organization}
配置 SSH 登录:
Host {organization}.github.com
HostName github.com
User git
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p
IdentitiesOnly yes
IdentityFile ~/.ssh/{organization}
Host {personal}.github.com
HostName github.com
User git
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p
IdentitiesOnly yes
IdentityFile ~/.ssh/{personal}
测试 ssh 秘钥配置正确性:
ssh -T git@{personal}.github.com
Hi {personal-name}! You’ve successfully authenticated, but GitHub does not provide shell access.
ssh -T git@{organization}.github.com
Hi {organization-name}! You’ve successfully authenticated, but GitHub does not provide shell access.
配置 Git
下面配置仓库对应的身份信息,以便进行 commit/push 操作时候可以获取到正确的身份信息:
cd {personal_repo}
git config user.name {personal-name}
git config user.email {personal-email}
cd {organization_repo}
git config user.name {organization-name}
git config user.email {organization-email}
查看配置git config --local --list
验证配置生效。
如果不同身份下的仓库很多,那么上面的操作就显得繁琐,可以通过 git-config 来解决。
git config -f {personal}.gitconfig user.name {personal_name}
git config -f {personal}.gitconfig user.email {personal_email}
git config -f {organization}.gitconfig user.name {organization_name}
git config -f {organization}.gitconfig user.email {organization_email}
git config --global includeIf."hasconfig:remote.*.url:*github.com:{personal}/**".path {personal}.gitconfig
git config --global includeIf."hasconfig:remote.*.url:*github.com:{organization}/**".path {organization}.gitconfig
进入到不同的额仓库目录,执行 git config --get user.name
验证是否与配置相同。
打通 git 与 SSH
git 底层使用 ssh 来访问 github,上述过程中,repo 对应的仓库 URL 都是 github.com
, 但 SSH 配置中为了区分身份,给 github.com
配置了别名,这会导致仓库不能正确 push/pull。
该问题可以通过 git 的 insteadOf
来解决:
[url "git@{organization}.github.com:{organization}/"]
insteadOf = git@github.com:{organization}/
查看配置
可以通过 git config -l --show-origin
查看 git 相关配置项来自哪个文件。
评论