管理2个Git用户的GPG密钥并选择每个用户的GPG签名。

17
我有一个 GitHub 用户和另一个 GitLab 用户,因为我的电子邮件地址不同,所以我为每个用户创建了一个 GPG 密钥。
问题是,每次我想提交到不同的 git 仓库时都必须执行 git config --global user.signingkey
是否有一种方法可以为每个 git 用户管理我的 GPG 密钥?

可能是根据SSH主机或身份指定Git身份的重复问题。 - Timothy Truckle
4个回答

30

我有同样的情况,但是需要分割工作/个人账户。我有很多代码库,但是我不想每次克隆新的代码库时都运行git config

我已经写了一篇博客文章介绍如何自动完成这个过程。一种自动化的方法是使用git提供的includeIf指令。你可以从git手册的条件包含部分了解更多信息。


有一个小要求,您需要能够通过路径中的组件区分GitHub存储库和GitLab存储库(例如,将GitHub克隆放在〜/ github 中,将Gitlab克隆放在〜/ gitlab 中)

然后,基本上将签名密钥配置拆分为两个文件:

# config.github
[user]
  name       = Chakrit
  email      = github@example.com
  signingkey = DEADBEEF

# config.gitlab
[user]
  name       = Chakrit
  email      = gitlab@example.com
  signingkey = BADC0FFEE

然后在您的主要~/.config/git/config配置文件中,使用includeIf gitdir:指令来匹配和包含基于您的WD的不同文件:

# when working with github
[includeIf "gitdir:**/github/**/.git"]
  path = config.github

# when working with gitlab
[includeIf "gitdir:**/gitlab/**/.git"]
  path = config.gitlab

然后,您在~/github文件夹中的所有存储库都将自动使用您的GitHub密钥,而在~/gitlab文件夹中的存储库将使用您的GitLab密钥。


.gitconfig 文件是否也使用相对路径? - Daniel Hajduk
1
“签名密钥配置”文件在哪里?我猜它不是与~/.config/git/config相同的文件吧? - djondal
1
在给定的示例中,在与主配置文件相同的目录中创建文件config.githubconfig.gitlab。每个github/gitlab配置应包含不同的用户密钥信息。 - Haren S
是的,就像Haren所说的那样。 - chakrit

5

从您的仓库和全局设置中删除所有user.signingkey设置。

git将决定使用匹配存储库中user.email设置的身份验证标识符的gpg密钥。


你能分享官方文档,更详细地说明这一点吗? - Jarmos
1
@Jarmos: user.signingKey:"如果在创建签名标签或提交时,git-tag或git-commit没有自动选择您想要的密钥,则可以使用此变量覆盖默认选项。[...]"gpg.ssh.defaultKeyCommand:"当user.signingkey未设置并且请求ssh签名时将运行此命令。[...]" - andthum
如果您的登录帐户UPN与用于签名密钥的电子邮件不同,则无法正常工作。 - Igor Levicki

4
签名密钥可以针对每个存储库进行设置,只需在已检出的存储库中执行:git config user.signingkey。此命令将配置设置在存储库的.git/config中。使用--global选项会将配置写入~/.gitconfig,成为没有本地值设置的存储库的默认值。
有关更多信息,请参阅git-config手册中的user.signingKey部分。
您还可以通过将user.email设置为与存储库相关联的电子邮件来获得更好的结果。

0
我会改进@chakrit的答案,但是编辑队列已经满了一段时间了...
我更喜欢一种与文件系统无关的方法,并根据远程Git主机的URL加载正确的配置。
[includeIf "hasconfig:remote.*.url:**/github.com*/**"]
    path = config.github

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接