0 更新记录
- 2023-11-07: 同时使用两个GitHub账号。
- 2023-12-27: 更新使用GPG密钥部分。
- 2024-10-16: 更新一些命令输出。
有时需要在一台电脑中,同时使用不同的GitHub账号管理不同的仓库,解决方法是取消全局的用户名和邮箱设置,分别配置不同仓库的用户名和邮箱,并在ssh配置中,为每个GitHub远程仓库地址配置对应的私钥。
下面以用户user_aaa
、邮箱user_aaa@demo.com
和用户user_bbb
、邮箱user_bbb@demo.com
为例配置,分别在 Windows 10/11、Debian 12 及 Ubuntu 20/22 上测试正常。
1 清除全局配置
使用多个Github账号时需要给每个git仓库设置单独的账号,应当清除全局配置的用户名和邮箱:
1 | # 检查全局配置 |
2 配置SSH密钥对
2.1 生成每个账号的 SSH 密钥对
生成密钥时需修改路径及文件名,默认路径 ~/.ssh
,公钥的默认文件名为id_ed25519.pub
,私钥的默认文件名为id_ed25519
:
1 | # user_aaa SSH Key:id_ed25519_user_aaa, id_ed25519_user_aaa.pub |
2.2 配置ssh-agent(可选)
将所有私钥添加至 ssh-agent,并配置 ssh-agent 自启动,ssh-agent详解,计算机管理-服务-OpenSSH Authentication Agent-自动启动:
1 | # 启动 ssh-agent |
2.3 将SSH公钥添加到GitHub
将各账号公钥(cat ~/.ssh/id_ed25519_user_xxx.pub
)填写至 GitHub Settings - SSH keys
2.4 修改ssh配置文件
修改 SSH 配置文件 ~/.ssh/config
,指定远程主机的别名,各自使用的账号和私钥文件
1 | Host user_aaa.github.com |
参数说明:
- Host 设置主机别名,用于标识一个配置,可设置成任意字符串,并非必须使用域名形式。
- HostName 设置主机地址,即主机 IP 或域名。
- User 设置登录的用户名。
- IdentifyFile 设置对应用户的密钥文件。
- Port 设置 SSH 端口。
在GitHub应用中,User参数可以不设置。
设置Host别名后,SSH/SCP 可使用主机别名代替user@IP
:
- 例如
scp a.txt demo@192.168.0.101:~
=>scp a.txt HOST:~
; - 或者
ssh demo@192.168.0.101
=>ssh HOST
。
2.5 测试与GitHub的连接
必须使用 git 作为用户名测试,原因,主机使用主机别名,首次与 GitHub 连接需要输入 yes 设置 known_hosts。
1 | ssh -T git@user_aaa.github.com |
2.6 修改Git仓库的远程地址
为仓库设置使用主机别名的远程地址。
进入对应仓库目录后设置
- 新 clone 的仓库在 clone 时可以直接修改远程地址:
1 | # 使用主机别名代替 GitHub 域名 |
- 本地已有的仓库/新建的仓库修改远程地址:
1 | cd git_repo/ |
2.7 修改Git仓库的账号信息
为仓库设置单独的用户名和邮箱。
进入对应仓库目录后设置
1 | cd git_repo/ |
至此,已经完成了在一台电脑中,同时使用不同的GitHub账号管理不同的仓库的设置。
以下内容是在GitHub中使用GPG签名的设置过程,GPG是一种安全机制,可以确保提交的真实性,防止其他人使用你的邮箱和用户名“冒充”你提交代码。
3 使用GPG
与设置SSH密钥的过程类似,每个账号都需要自己的GPG密钥,以下仅记录单个账号的设置过程:
3.1 生成GPG密钥
1 | gpg --full-generate-key |
生成密钥时需要填写用户名和邮箱,邮箱必须填写在Git仓库中设置的账号的邮箱,而且必须是GitHub账户中经过验证的邮箱地址。不同账号对应不同的邮箱,也就对应不同的GPG密钥。这一步无特殊需要可以不设置密码,否则后续使用中每次使用GPG签名时(如提交commit和tag时)都需要输入GPG密钥的密码进行验证。
使用gpg --list-keys
可以查看本机所有的GPG密钥信息,指定参数--keyid-format long
使用长ID格式,pub
中的40位字符串是该GPG密钥指纹(Fingerprint),也是GPG密钥的ID,用于标识这个GPG密钥;长ID是指纹的后16位字符,即pub rsa3072/
后面的16位字符,短ID(用参数--keyid-format short
查看)为指纹的后8位字符。
在不造成混淆的情况下,使用指纹、长ID或者短ID都可以。一般使用长ID,以下命令中用<key-id>
代替具体的长ID。
1 | gpg --list-keys --keyid-format long |
3.2 将GPG公钥添加到Github
使用命令gpg --armor --export <key_id>
可以根据密钥的ID显示其公钥,将对应账号的公钥信息在终端中导出并复制,添加到对应GitHub账户中,添加位置 GitHub Settings - GPG keys。
3.3 使用GPG签名commit和tag
首先在Git仓库中指定使用的GPG密钥,通过密钥的ID指定。需要注意的是由于不同账号使用的是不同的GPG密钥,设置时应使用局部设置,不要使用全局设置。这里的--local
可以不加,在不指定--local
时默认进行的就是局部设置。
进入对应仓库目录后设置
1 | git config --local user.signingkey <key-id> |
在执行git commit
时加入-S
参数(注意为大写S),可以使用GPG签名当前的commit提交:
1 | git commit -S -m "commit message" |
方便起见可以设置默认使用GPG签名新commit,注意是本地局部设置:
1 | git config --local commit.gpgsign true |
在执行git tag
时使用-s
参数替换-a
(注意为小写s),可以使用GPG签名当前的标签:
1 | # 带GPG签名的标签 |
同样可以设置默认使用GPG签名新标签,设置后不论是否使用-s
参数创建标签,均会使用指定的GPG密钥进行签名:
1 | git config --local tag.gpgsign true |