0. 前言
不知是否有人像我一样,搞了两个GitHub账号,一个用来正常的和别人合作项目,另一个用来自己写一些代码,希望能做到两个本地账户和远程账号都完全隔离,没有联系,也不会被混淆使用。
当初的我以为只要把同一个 SSH 公钥分别添加到两个 GitHub 账户,再在不同的仓库设置不同的user.name
和 user email
就OK了.后来发现我太天真了,并不行,每个公钥只能用一次。然后我就考虑生成两个密钥,分别添加到不同的账户,但是电脑在连接远程仓库时,只能默认选择其中固定的一个来连接,并不会根据我不同仓库的设置选择不同的密钥,结果就是还是只能免密连接一个 GitHub 账户的仓库。
你所使用的 SSH 密钥决定了你是否有权限访问某一个 GitHub 账号下面的仓库,而你本地仓库设置的 use email
决定了在 GitHub 的 commit 记录中的用户,而一般在没有进行以下配置的情况下,你的电脑只会默认使用一个 SHH 密钥进行连接,这就导致了你只能访问一个 GitHub 账号。
然后就到处找教程,但是不知道是否是因为时间太久远了,都是错误的,而且错误都是一样的,最后终于七拼八凑整成功了。
下面将详细介绍方法。
1. 生成密钥
首先是先生成两个SSH密钥,对应你的两个身份(假设为 public 和 private)。
假设你当初已经用ssh-keygen -t rsa -C “youremail@gmail.com”
生成了一对秘钥id_rsa
和id_rsa.pub
, 保存在了~/.ssh
文件夹内。
然后,你需要再用另一个邮箱生成一对 private 的秘钥ssh-keygen -t rsa -C “private_email@gmail.com”
-f private。这时候要注意重命名,否则会覆盖上面的密钥文件。假设我们生成了一对新的秘钥private
和private.pub
。不知道为什么默认生成在 ~/.ssh 目录的上级目录,请将这两个文件复制到 ~/.ssh 下。
然后分别将这两对密钥加入到对应的 GitHub 账户中!!!!
2. 编辑配置文件(这个很重要)
编辑~/.ssh/config
文件。如果该文件不存在的话,直接创建一个就好。里面的内容如下:
Host github.com
HostName github.com
IdentityFile C:\Users\chl.ssh\id_rsa
PreferredAuthentications publickey
User chl
Host github1.com
HostName github.com
IdentityFile C:\Users\chl.ssh\id_rsa2
PreferredAuthentications publickey
User chl2
!!!非常重要 Host github1.com
:这是自定义的主机别名,你可以在使用 Git 时使用这个别名来代替实际的 GitHub URL。例如,你可以使用
git clone git@github1.com:username/repository.git来代替
git clone git@github.com:username/repository.git`。 HostName github.com是默认访问的github账户!!!
==
修改完之后,在git bash
运行以下命令(@
后面的主机名为上面配置文件中填写的Host
选项),检查是否正常。
(先注意一下:这里一定是先把两个公钥添加到对应的 GitHub 账户,再进行下面的 ssh 连接测试,否则肯定是连接不上,会显示 permission denied。)
ssh -T git@github.com
ssh -T git@github1.com
如果都能正常返回如下信息,就说明配置正常。
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
同样的方式你就可以配置更多的以SSH登录的不同git用户。
3. 配置仓库设置
首先要删除GIT配置的全局用户名和邮件地址,接着在每个项目仓库中按照需求设置不同的user.name
和 user.email
:
# 删除全局设置
git config --global --unset user.name
git config --global --unset user.email
# 添加本地设置
# 设置为私有仓库的GitHub账号邮箱和公有账号的GitHub邮箱。
git config --local user.name xxxx
git config --local user.email xxx
之后在添加远程仓库的时候,把github.com
修改成github_public
或者github_private
就好了(即上述文件中的HOST选项),用上面两个 Host 名称来代替原来的github.com
,(这一步很重要)如:
git remote add origin git@github_public:xxx/example.git # public user
git remote add origin git@github_private:xxx/example.git # priavate user
其实,上面的配置文件的意思就是,按照你设置远程仓库时使用不同的 Host 名称,查找~/.ssh/config
文件,使用不同的 SSH 文件连接到 GitHub。这样你就将是以不同的身份访问 GitHub 仓库。
4.解决无权限问题
删除.ssh下的两个know… 文件