告诉git使用哪个SSH配置文件

pfw*_*fwd 9 git ssh ssh-keys

我有各种系统的多个ssh配置文件夹,例如:

ssh -F ~/.ssh/system-a/config user@system-a
ssh -F ~/.ssh/system-b/config user@system-b
Run Code Online (Sandbox Code Playgroud)

每个文件夹都有一个配置文件和一组标识文件,如此

Host system-a
    HostName <some_hostname>
    User <some_username>
    IdentityFile ~/.ssh/system-a/keys/system-a.pem
Run Code Online (Sandbox Code Playgroud)

在执行git任务时如何告诉git使用某个ssh配置文件或某个ssh密钥?

理想情况下,如果可以,我希望每个git项目都这样做.

Rik*_*Rik 16

我想深入探讨这个主题,因为我最近一直在尝试解决这个问题,而不必执行git config core.sshCommand我克隆的每个新版本

因此,为此我对Jakuje的实现进行了一些扩展

我有两个 gitlab 帐户。一种是工作用的,带有我的工作电子邮件,一种是个人用的,带有我的个人电子邮件。

为此,我有两个不同的私钥:

  • 个人的:~/.ssh/keys/personal.id_rsa
  • 工作:~/.ssh/keys/work.id_rsa

现在,我有一个位于 的全局 git 配置~/.gitconfig和位于 的替代配置~/work.gitconfig。工作 git 配置仅包含与全局配置不同的设置。

所以在这个场景中,

〜/工作.gitconfig

[core] 
    sshCommand = ssh -i ~/.ssh/keys/work.id_rsa
Run Code Online (Sandbox Code Playgroud)

以及我克隆到的所有与工作相关的存储库~/source/work

然后神奇的事情就发生在我的身上~/.gitconfig。我包括以下部分(git includeIf

[includeIf "gitdir:~/source/work/**"]
    path="~/work.gitconfig"
Run Code Online (Sandbox Code Playgroud)

现在,这将告诉我git将我的工作 git 配置包含在~/source/work. 然后,此配置将自动将推送/拉取时使用的 ssh 密钥设置为我用于工作存储库的密钥。

您需要确保的是克隆到正确的文件夹中。

您可以将其与使用通用 ssh 配置结合起来。

Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/keys/personal.id_rsa

Run Code Online (Sandbox Code Playgroud)

默认情况下,git 将使用personal.id_rsa(个人帐户),除非存储库位于work目录中,否则使用工作帐户(基于 ssh 密钥)。

  • 这个答案应该更高 - [includeIf“glob_pattern”] 是天才,完全解决了我的情况,而不需要额外的配置/工具。 (3认同)

Jak*_*uje 10

在命令行上:

git config core.sshCommand "ssh -F ~/.ssh/system-a/config"
Run Code Online (Sandbox Code Playgroud)

或者在.git/config本地存储库中的[core]部分:

sshCommand = "ssh -F ~/.ssh/system-a/config"
Run Code Online (Sandbox Code Playgroud)

这只适用于git 2.10和更新版本.否则,需要使用环境变量进行设置$GIT_SSH_COMMAND.


uml*_*ute 9

正如 Andrejs Cainikovs 和 Jakuje 指出的那样,可以使用多个 ssh-config 文件和足够新的git.

但是,您可以使用具有多个配置的单个 ssh-config 文件获得几乎相同的结果,可能所有配置都指向单个真实主机:

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
Run Code Online (Sandbox Code Playgroud)

然后像这样克隆 repos:

  git clone SOMELABEL:foo/bar.git
  git clone OTHERLABEL:frobnozzel.git
Run Code Online (Sandbox Code Playgroud)

这将<some_username>@<some_hostname>与存储库中的 ssh-key 一起使用,而它将~/.ssh/system-a/keys/system-a.pembar存储库中<other_username>@<other_hostname>的 ssh-key 一起~/.ssh/system-b/keys/system-a.pem使用frobnozzel

  • 这是可行的,但是您必须认识到,为了使用“git@github.com”克隆地址,您必须在配置文件中使用该地址的主机名和“git”用户,因此“Host”指令应该设置为 `github.com` 且 `User` 指令应设置为 `git` - 否则您将无法使用 `git@github.com` 指令进行克隆 - 其他 git 远程地址/主机名也是如此。 (2认同)