我有多个用于各种系统的ssh配置文件夹,例如:
ssh -F ~/.ssh/system-a/config user@system-a
ssh -F ~/.ssh/system-b/config user@system-b
每个文件夹都有一个配置文件和一组标识文件,如下所示
Host system-a
HostName <some_hostname>
User <some_username>
IdentityFile ~/.ssh/system-a/keys/system-a.pem
如何告诉 git 在执行 git 任务时使用某个 ssh 配置文件或某个 ssh 密钥?
理想情况下,如果可以的话,我想为每个 git 项目执行此操作。
在命令行上,您可以更改当前存储库的 Git 配置:
git config core.sshCommand "ssh -F ~/.ssh/system-a/config"
或.git/config
本地存储库中的"[core]
"部分:
sshCommand = "ssh -F ~/.ssh/system-a/config"
这仅适用于 git 2.10 及更高版本。否则,需要使用环境变量$GIT_SSH_COMMAND
进行设置,例如:
GIT_SSH_COMMAND="ssh -F ~/.ssh/system-a/config" git pull
正如Andrejs Cainikovs和Jakuje所指出的,可以使用多个具有足够新git
的ssh配置文件。
但是,使用具有多个配置的单个 ssh 配置文件可以实现几乎相同的结果,可能都引用单个真实主机:
Host SOMELABEL
HostName <some_hostname>
User <some_username>
IdentityFile ~/.ssh/system-a/keys/system-a.pem
Host OTHERLABEL
HostName <other_hostname>
User <other_username>
IdentityFile ~/.ssh/system-b/keys/system-a.pem
然后克隆存储库,如下所示:
git clone SOMELABEL:foo/bar.git
git clone OTHERLABEL:frobnozzel.git
这将<some_username>@<some_hostname>
与 ssh key 一起使用~/.ssh/system-a/keys/system-a.pem
用于bar
存储库,而它将<other_username>@<other_hostname>
与 ssh key 一起使用~/.ssh/system-b/keys/system-a.pem
用于frobnozzel
存储库。
我想进入这个话题,因为我最近一直在尝试解决这个问题,而不必对我克隆的每个新版本进行git config core.sshCommand
因此,为此,我对Jakuje的实现进行了一些扩展
我有两个 gitlab 帐户。一个是工作,使用我的工作电子邮件,另一个是个人的,使用我的个人电子邮件。
为此,我有两个不同的私钥:
- 个人:
~/.ssh/keys/personal.id_rsa
- 工作:
~/.ssh/keys/work.id_rsa
现在,我有一个位于~/.gitconfig
的全局 git 配置和一个位于~/work.gitconfig
的替代配置。工作 git 配置仅包含与全局配置不同的设置。
所以在这种情况下,
~/work.gitconfig
[core]
sshCommand = ssh -i ~/.ssh/keys/work.id_rsa
以及我克隆到~/source/work
的所有与工作相关的存储库
然后魔术发生在我的~/.gitconfig
.我包括以下部分(gitincludeIf
):
[includeIf "gitdir:~/source/work/**"]
path="~/work.gitconfig"
现在,这将告诉git
为~/source/work
中的所有存储库包含我的工作 git 配置。然后,此配置将自动将推送/拉取时使用的 ssh 键设置为我用于工作存储库的密钥。
您需要做的就是克隆到正确的文件夹中。
您可以将其与使用通用 ssh 配置结合使用。
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/keys/personal.id_rsa
默认情况下,git 将使用personal.id_rsa
(个人帐户),除非存储库位于work
目录中,则使用工作帐户(基于 ssh 密钥)。
git 2.10+
检查雅库耶的答案。
git 2.9-
使用指向执行魔术的自定义脚本的core.gitproxy
。