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 |