1. 为每个账户分别创建SSH密钥
Windows系统下, git 的ssh文件夹通常在C:\Users\[your user name]\.ssh
(将[your user name] 替换成你的用户名。
在此处唤出git bash, 输入命令 ssh-keygen -t rsa -C "your-email-address"
,这里的邮箱地址我填的是github生成的隐私保护地址,你也可以填写其他与github绑定的邮箱。该条命令执行之后,会让你输入文件名(例如我输入"sec_account")。所有命令执行成功后会在文件夹中生成sec_account
(私钥)和sec_account.pub
(公钥)两个文件。
Note: 需要N个账户,就需要创建N个RSA密钥
2. 在Github用户设置中添加公钥
用文本编辑器(记事本,Notepad++ 等)打开步骤1生成的sec_account.pub
文件,文件内容开头几个字符是ssh-rsa
。
在Github网站上登录,进入"Setting"->“SSH and GPG keys”, 选择New SSH Key,然后将sec_account.pub
文件中的文本粘贴赋值在输入框中。 标题可以随便写。
3. 添加Config文件并测试SSH连接
返回C:\Users\[your user name]\.ssh
文件夹。如果该文件夹下没有config
文件,则可以新建一个config文件,手动右键或者使用命令行touch ~/.ssh/config
都可以。在该文件中配置多用户和相关密钥的联系。为每一个用户,输入以下配置信息:
Host [host]
Hostname ssh.github.com
IdentityFile ~/.ssh/[rsa key name]
User [your user name]
参数说明:
[host]
替换成任意合法字段都可以,但在后面测试和push到远程仓库是都会用到,所以不必要设置的太复杂,我习惯git_[username]
来区分不同账户。[rsa key name]
是步骤1中生成的密钥的名字,也是每个账户一个Your user name
输入github的username
用例:
# Public
Host git_alex
Hostname ssh.github.com
IdentityFile ~/.ssh/first_account
User git_alex
# Individual
Host git_bob
Hostname ssh.github.com
IdentityFile ~/.ssh/sec_account
User bob
保存config文件后,打开git命令行,来测试配置是否正确。输入命令ssh -T git@[host]
其中[host]
就是在config文件中配置的信息。根据上面的例子,我输入ssh -T git@git_bob
,执行命令后会输出以下信息,直接输入yes
即可。如果想检查host的指纹,以确定地址没有被劫持,可以在Github Fingerprint中找到相应的哈希值。
> The authenticity of host 'github.com (IP ADDRESS)' can't be established.
> RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
> Are you sure you want to continue connecting (yes/no)?
如果以上配置正确,输入yes后,命令窗口输出以下信息:
> Hi username! You've successfully authenticated, but GitHub does not
> provide shell access.
4 本地仓库设置
4.1 仓库个人信息设置
大多数中文教程里提到需要删除全局用户名和用户邮箱。但是这并不是必需的,使用全局邮箱和用户名并不会影响你向不同用户的仓库推送。但是需要注意的是,Github的Contribution只计算Primary Email的主分支,因此如果你想玩Github的涂色游戏的话,还是需要为每个仓库独立设置用户名和邮箱:
输入以下命令,删除全局用户名和邮箱:
git config --global --unset 'user.name'
git config --global --unset 'user.email'
在需要上传的仓库,设置本地用户名和邮箱:
git config user.name 'bob'
git config user.email'bob@example.com'
4.2 添加远程仓库
由于本教程使用SSH连接,而不是直接用HTTPS,所以推送远程仓库的时候只能使用SSH方式。
- 复制远程仓库的ssh克隆地址。例如
git@github.com:repo/username.github.io.git
- 将上面地址中的
github.com
改成步骤3中设置的[host]
值,Bob账户新的ssh远程仓库地址即是git@git_bob:repo/username.github.io.git
- 在需要push的仓库中输入
git remote add origin_ssh git@git_bob:repo/username.github.io.git
5 推送分支到远程仓库
输入git push origin_ssh master
将当前分支推送到远程仓库
References: