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
3
4
5
# 检查全局配置
git config --global --list
# 删除全局用户名和邮箱
git config --global --unset user.name
git config --global --unset user.email

2 配置SSH密钥对

2.1 生成每个账号的 SSH 密钥对

生成密钥时需修改路径及文件名,默认路径 ~/.ssh,公钥的默认文件名为id_ed25519.pub,私钥的默认文件名为id_ed25519

1
2
3
4
5
6
7
8
9
10
11
# user_aaa SSH Key:id_ed25519_user_aaa, id_ed25519_user_aaa.pub
ssh-keygen -t ed25519 -C "user_aaa@demo.com"
# 为了便于区分,在文件名后添加实际用户名
mv id_ed25519 id_ed25519_user_aaa
mv id_ed25519.pub id_ed25519_user_aaa.pub

# user_bbb SSH Key:id_ed25519_user_bbb, id_ed25519_user_bbb.pub
ssh-keygen -t ed25519 -C "user_bbb@demo.com"
# 为了便于区分,在文件名后添加实际用户名
mv id_ed25519 id_ed25519_user_bbb
mv id_ed25519.pub id_ed25519_user_bbb.pub

2.2 配置ssh-agent(可选)

将所有私钥添加至 ssh-agent,并配置 ssh-agent 自启动,ssh-agent详解,计算机管理-服务-OpenSSH Authentication Agent-自动启动:

1
2
3
4
5
6
7
8
9
# 启动 ssh-agent
eval "$(ssh-agent -s)"
# 添加私钥
ssh-add ~/.ssh/id_ed25519_user_aaa
ssh-add ~/.ssh/id_ed25519_user_bbb
# 检查是否添加成功
ssh-add -l
# 256 SHA256:1G+KrSt3szM...2hs user_aaa@demo.com (ED25519)
# 256 SHA256:g0xZJcaUA93...HCY user_bbb@demo.com (ED25519)

2.3 将SSH公钥添加到GitHub

将各账号公钥cat ~/.ssh/id_ed25519_user_xxx.pub)填写至 GitHub Settings - SSH keys

2.4 修改ssh配置文件

修改 SSH 配置文件 ~/.ssh/config,指定远程主机的别名,各自使用的账号和私钥文件

1
2
3
4
5
6
7
8
9
Host user_aaa.github.com
HostName github.com
User user_aaa
IdentityFile ~/.ssh/id_ed25519_user_aaa

Host user_bbb.github.com
HostName github.com
User user_bbb
IdentityFile ~/.ssh/id_ed25519_user_bbb

参数说明:

  • 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
2
3
4
5
6
ssh -T git@user_aaa.github.com
# "Hi user_aaa! You've successfully authenticated, but GitHub does not provide shell access."
ssh -T git@user_bbb.github.com
# "Hi user_bbb! You've successfully authenticated, but GitHub does not provide shell access."
# 连接出现问题时,使用 -v 参数进入调试模式,显示详细的连接过程
ssh -v git@user_bbb.github.com

2.6 修改Git仓库的远程地址

为仓库设置使用主机别名的远程地址。

进入对应仓库目录后设置

  • 新 clone 的仓库在 clone 时可以直接修改远程地址:
1
2
3
4
5
6
7
8
9
# 使用主机别名代替 GitHub 域名
# 原地址:git@github.com:user_aaa/git_repo.git
# 修改为:git@user_aaa.github.com:user_aaa/git_repo.git
git clone git@user_aaa.github.com:user_aaa/git_repo.git
cd git_repo/
# 检查远程地址
git remote -v
# "origin git@user_aaa.github.com:user_aaa/git_repo.git (fetch)"
# "origin git@user_aaa.github.com:user_aaa/git_repo.git (push)"
  • 本地已有的仓库/新建的仓库修改远程地址:
1
2
3
4
5
6
7
8
cd git_repo/
# 检查远程地址
git remote -v
# "origin git@github.com:user_aaa/git_repo.git (fetch)"
# "origin git@github.com:user_aaa/git_repo.git (push)"
# 删除后添加
git remote rm origin
git remote add origin git@user_aaa.github.com:user_aaa/git_repo.git

2.7 修改Git仓库的账号信息

为仓库设置单独的用户名和邮箱。

进入对应仓库目录后设置

1
2
3
cd git_repo/
git config user.name "user_aaa"
git config user.email "user_aaa@demo.com"

至此,已经完成了在一台电脑中,同时使用不同的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
2
3
4
5
6
7
8
9
10
11
12
gpg --list-keys --keyid-format long
# /c/Users/abc/.gnupg/pubring.kbx
# ------------------------------
# pub rsa3072/XXXXXXXXXXXXXEF1 2023-10-16 [SC]
# 466XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEF1
# uid [ultimate] user_aaa <user_aaa@demo.com>
# sub rsa3072/XXXXXXXXXXXXX736 2023-10-16 [E]

# pub rsa3072/XXXXXXXXXXXXX9E2 2023-12-27 [SC]
# D71XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX9E2
# uid [ultimate] user_bbb <user_bbb@demo.com>
# sub rsa3072/XXXXXXXXXXXXXF47 2023-12-27 [E]

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
2
# 带GPG签名的标签
git tag -s <tag_name> -m "tag_message" [optional:Hash]

同样可以设置默认使用GPG签名新标签,设置后不论是否使用-s参数创建标签,均会使用指定的GPG密钥进行签名:

1
git config --local tag.gpgsign true

本站由 @gsh1209 使用 Stellar 主题创建
Copyright © 2023 - BG3LNT.XYZ
Favicon图标来自 @ChenCJ
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处
正在计算运行时间...

蒙ICP备2022000455号-2