One possibility to use ~/.ssh/config
is to use the Match
restriction instead of the Host
restriction. In particular Match Exec
calls a shell command to decide whether to apply the declarations or not. In bash you could use the following command:
[ [email protected]:gitolite-admin = $(git config --get remote.origin.url)'' ]
This uses the bash [
command to verify if two strings are equal. In this case it is testing if the string [email protected]:gitolite-admin
matches the output that is obtained from the $(git config --get remote.origin.url)''
command.
You can use any other command that identifies the repository that the shell is on. For this to work it is important to have the $SHELL
variable defined to your shell, in my case /bin/bash
. The full example would then be the following ~/.ssh/config
:
Match Exec "[ [email protected]:gitolite-admin = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/gitolite-admin
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
Match Exec "[ [email protected]:some_repo = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/yourOwnPrivateKey
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
In this example I assumed that ~/.ssh/yourOwnPrivateKey
contains your own private key and that ~/.ssh/gitolite-admin
contains the private key of the user gitolite-admin
. I included the IdentitiesOnly yes
declaration to make sure that only one key is offered to the git server, mentioned by Mark Longair. The other declarations are just standard ssh options for git.
You can add this configuration if you have several some_repo
that you want to use with different keys. If you have several repositories at [email protected]
and most of them use the ~/.ssh/yourOwnPrivateKey
it makes more sense to include this key as default for the host. In this case the ~/.ssh/config
would be:
Match Exec "[ [email protected]:gitolite-admin = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/gitolite-admin
IdentitiesOnly yes
Host git.company.com
IdentityFile ~/.ssh/yourOwnPrivateKey
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
Note that the order matters and the Host git.company.com
restriction should appear after the Match Exec
one or ones.