如何指定 go get 使用哪个 ssh 密钥

glo*_*bia 5 git github go ssh-keys go-get

我在同一台笔记本电脑(运行 Ubuntu 版本 20)上使用两个不同的 github 帐户(个人和工作)。我需要能够使用我的工作 github 帐户的 ssh 密钥从工作中访问私有存储库。

我已经使用一些简洁的 git 配置控件使这一切正常工作,即在我的~/.gitconfig文件中放入:

[url "git@github.com:work_account/"]
    insteadOf = https://github.com/work_account/
[includeIf "gitdir:~/src/github.com/personal_account/"]
    path=~/.gitconfig_personal
[includeIf "gitdir:~/src/github.com/work_account/"]
    path=~/.gitconfig_work
Run Code Online (Sandbox Code Playgroud)

个人配置包含:

[user]
name = Your Name
email = your.name@gmail.com
[core]
sshCommand = ssh -i ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

工作配置包含:

[user]
name = Your Name
email = your.name@work.com
signingkey = <ID of GPG key>
[core]
sshCommand = ssh -i ~/.ssh/id_ecdsa
[commit]
gpgsign = true
[gpg]
program = gpg
Run Code Online (Sandbox Code Playgroud)

这对于从 github 拉取和推送(并使用 gpg 密钥签署工作提交)非常有效,但在go get私人存储库上却失败了。由于某些奇怪的原因,go get我试图使用我的个人 ssh 密钥 ( ~/.ssh/id_rsa) 而不是我的工作 ssh 密钥 ( ~/.ssh/id_ecdsa)。我已经设置了GOPRIVATE环境变量,即

export GOPRIVATE=github.com/work_account/*
Run Code Online (Sandbox Code Playgroud)

go get 的输出如下:

$ go get github.com/work_account/private_repo
go get github.com/work_account/private_repo: module github.com/work_account/private_repo: git ls-remote -q origin in /home/marc/pkg/mod/cache/vcs/ff3efb332cb48232e5da90ff2073685cbdac4a86e3a47aa11663696f4943637a: exit status 128:
        ERROR: Repository not found.
        fatal: Could not read from remote repository.

        Please make sure you have the correct access rights
        and the repository exists.
Run Code Online (Sandbox Code Playgroud)

我可以看到我的 ssh 代理有两个密钥:

$ ssh-add -l
521 SHA256:EKvhgg24_blah_bApjLSqX4J7l0 your.name@work.com (ECDSA)
4096 SHA256:r/qcO94F+ox_blah_JkTiVk+aERk your.name@gmail.com (RSA)
Run Code Online (Sandbox Code Playgroud)

当我删除我的个人 ssh 密钥(即rm ~/.ssh/id_rsa*)然后go get在私人存储库上工作得很好,所以我知道这肯定只是试图使用错误的 ssh 密钥。由于某种原因,它忽略了 git config core.sshCommand

glo*_*bia 7

经过大量的尝试、错误和挖掘,我找到了解决方案。GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ecdsa"如果我在私有存储库中设置环境变量,然后go get使用正确的 ssh 密钥,然后适用于私有存储库。似乎go get忽略了 git configcore.sshCommand但正在考虑环境变量GIT_SSH_COMMAND

为了简化我的生活,我使用该程序direnv在我保存工作存储库的文件夹中设置此环境变量。.envrc顶级文件夹中的文件如下所示:

export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ecdsa"
Run Code Online (Sandbox Code Playgroud)