使用する1つの可能性~/.ssh/configは、Match制限の代わりに制限を使用することですHost。特にMatch Exec、シェルコマンドを呼び出して、宣言を適用するかどうかを決定します。bashでは、次のコマンドを使用できます。
[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]
これはbash [コマンドを使用して、2つの文字列が等しいかどうかを確認します。この場合git@git.company.com:gitolite-admin、$(git config --get remote.origin.url)''コマンドから取得した出力と文字列が一致するかどうかをテストしています。
シェルが存在するリポジトリーを識別する他のコマンドを使用できます。これが機能するためには、変数をシェルに定義することが重要$SHELLです(私の場合)/bin/bash。完全な例は次のようになります~/.ssh/config。
Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/gitolite-admin
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
Match Exec "[ git@git.company.com:some_repo = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/yourOwnPrivateKey
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
この例では、私はそれが前提と~/.ssh/yourOwnPrivateKeyあなた自身の秘密鍵が含まれており、それが~/.ssh/gitolite-adminユーザーの秘密鍵が含まれていますgitolite-admin。Mark LongairがIdentitiesOnly yes言及しているように、gitサーバーに提供されるキーが1つだけであることを確認する宣言を含めました。その他の宣言は、gitの標準のsshオプションにすぎません。
some_repo異なるキーで使用したいものがいくつかある場合は、この構成を追加できます。複数のリポジトリがgit@git.company.comあり、それらのほとんどを使用して~/.ssh/yourOwnPrivateKeyいる場合は、このキーをホストのデフォルトとして含める方が理にかなっています。この場合、次の~/.ssh/configようになります。
Match Exec "[ git@git.company.com: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
順序が重要であり、Host git.company.com制限がMatch Exec1つまたは複数の後に表示されることに注意してください。