【问题标题】:Tell git which SSH config file to use告诉 git 使用哪个 SSH 配置文件
【发布时间】:2022-01-18 21:36:36
【问题描述】:

我有多个用于各种系统的 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 ssh ssh-keys


【解决方案1】:

您可以在命令行上更改当前存储库的 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

【讨论】:

  • @AndrejsCainikovs 感谢您的指正。我没有找到实际的发行说明,并且 2.9 没有此功能。
  • 我喜欢直接添加对我为 GitHub 存储库创建的识别文件的引用,因此我使用 -i 选项在 .git/config 文件中进行 ssh。 sshCommand = "ssh -i ~/.ssh/github_reponame_rsa"
  • 替代方案,由于某些原因 -F 配置对我不起作用(git 2.25),我直接使用 -i 选项指定了 ssh 密钥。
【解决方案2】:

正如 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

然后像这样克隆存储库:

  git clone SOMELABEL:foo/bar.git
  git clone OTHERLABEL:frobnozzel.git

这将使用&lt;some_username&gt;@&lt;some_hostname&gt;~/.ssh/system-a/keys/system-a.pem 中的ssh-key 用于bar 存储库,而它将使用&lt;other_username&gt;@&lt;other_hostname&gt;~/.ssh/system-b/keys/system-a.pem 中的ssh-key 用于frobnozzel 存储库。

【讨论】:

  • @AndrejsCainikovs 我已更正(并已更新我的答案);我仍然不明白 为什么 多个 ssh-config-files 比单个文件更受欢迎(但当然这取决于@pfwd)
  • 当然,拥有一个~/.gitconfig~/.ssh/config 是可行的方法。但我认为 OP 遇到了问题。也许是测试自动化,或者什么......
  • @umläute 这正是我喜欢的工作方式。我喜欢为我的项目设置单独的配置文件和目录,而不是将它们混为一谈
  • @umläute 感谢您实际列出了git clone 命令。没有其他相关答案:)
  • 这行得通,但是您必须认识到,为了使用git@github.com 克隆地址,您必须在配置文件中使用地址的主机名和git 用户,所以@ 987654335@ 指令应设置为 github.comUser 指令应设置为 git - 否则您将无法使用 git@github.com 指令进行克隆 - 其他 git 远程地址/主机名也是如此。
【解决方案3】:

git 2.10+

检查Jakuje answer

git 2.9-

使用core.gitproxy 指向执行魔术的自定义脚本。

【讨论】:

    【解决方案4】:

    我想进入这个话题,因为我最近一直在尝试解决这个问题,而不必在我克隆的每个新版本都做一个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 中。我包括以下部分(git includeIf:

    [includeIf "gitdir:~/source/work/**"]
        path="~/work.gitconfig"
    

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

    您只需确保克隆到正确的文件夹。

    您可以将此与使用通用 ssh 配置结合使用。

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

    默认情况下,git 会使用personal.id_rsa(个人账户),除非repo 在work 目录下,否则使用工作账户(基于ssh 密钥)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2021-09-11
      • 2018-09-26
      相关资源
      最近更新 更多