I have the following use case: I would like to be able to push to git@git.company.com:gitolite-admin using the private key of user gitolite-admin, while I want to push to git@git.company.com:some_repo using 'my own' private key. AFAIK, I can't solve this using ~/.ssh/config, because the user name and server name are identical in both cases. As I mostly use my own private key, I have that defined in ~/.ssh/config for git@git.company.com. Does anyone know of a way to override the key that is used for a single git invocation?

(另外:gitolite根据键来区分谁在进行推送,所以就访问、所有权和审计而言,user@server字符串对于不同的用户是相同的,这不是问题。)


当前回答

即使用户和主机是相同的,在~/.ssh/config中仍然可以区分它们。例如,如果你的配置是这样的:

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

然后在URL中使用gitolite-as-alice和gitolite-as-bob代替主机名:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

Note

您希望包括IdentitiesOnly yes选项,以防止使用默认id。否则,如果您也有与默认名称匹配的id文件,它们将首先被尝试,因为与其他配置选项(遵守“first in wins”)不同,IdentityFile选项附加到要尝试的身份列表中。参见:https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807 # 450807

其他回答

如果在windows上使用Git版本的ssh, ssh配置中的身份文件行如下所示

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

其中/c代表c:

要检查,在git的bash做

cd ~/.ssh
pwd 

Mark Longair提供的上述方法的另一种替代方法是使用别名,该别名将在任何远程上运行任何git命令,并使用替代SSH密钥。这个想法基本上是在运行git命令时切换您的SSH身份。

相对于另一个答案中的主机别名方法的优点:

将与任何git命令或别名一起工作,即使您不能显式地指定远程。 更容易使用多个存储库,因为您只需要在每个客户端机器上设置一次,而不是在每个客户端机器上的每个存储库设置一次。

我使用了一些小脚本和一个git别名admin。这样我就可以做,例如:

git admin push 

使用替代SSH密钥(“admin”)推到默认远程。同样,对于这个别名,您可以使用任何命令(不仅仅是push)。你甚至可以做git管理克隆…克隆一个您只能使用“admin”密钥访问的存储库。

步骤1:创建替代SSH密钥,可选地设置一个密码短语,以防您在其他人的机器上执行此操作。

步骤2:创建一个名为“SSH -as.sh”的脚本,运行使用SSH的东西,但使用给定的SSH密钥,而不是默认的:

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

步骤3:创建一个名为“git-as.sh”的脚本,使用给定的SSH密钥运行git命令。

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

第四步:添加一个别名(使用下面的“PATH_TO_SCRIPTS_DIR”):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

更多详情请访问:http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

从git 2.10开始,也可以使用gitconfig sshCommand设置。文档状态:

如果设置了这个变量,当git fetch和git push需要连接到远程系统时,它们将使用指定的命令而不是ssh。该命令与GIT_SSH_COMMAND环境变量的形式相同,在设置环境变量时将被覆盖。

一个使用示例是:git config core。ssh -i ~/.ssh/[insert_your_keyname]

在某些情况下,这行不通,因为ssh_config覆盖了命令,在这种情况下,尝试ssh -i ~/。ssh/[insert_your_keyname] -F /dev/null不使用ssh_config. sh

如果你已经有默认的ssh密钥配置,但想要对特定的存储库使用不同的配置,那么这应该可以做到:

git config core.sshCommand "ssh -i ~/.ssh/github-personal -o IdentitiesOnly=yes -F /dev/null"

对于git来说,除了更改配置文件,它应该使用不同的SSH密钥,如下所述: https://stackoverflow.com/a/7927828/1306884 您可能还需要清除并重新加载活动的SSH标识。

在Mac上,执行以下操作:

ssh-add -D
ssh-add ~/.ssh/id_rsa_one_that_you_want_to_use_instead

使用这两个命令,并设置GIT URL以匹配ssh/config文件的Host中定义的字符串,应该允许您为不同的存储库使用不同的ssh密钥。

例如,对于主机work.github.com,在克隆存储库时使用work.github.com作为URL git@work.github.com:your/repository.git。