Edited at

git clone 時に秘密鍵を指定する

git の支援が弱くて変なやり方しかない。

=> GIT_SSH_COMMAND または git -c core.sshCommand が使えます。


.ssh/config をいじる

.ssh/config を1瞬いじって元に戻す、みたいな


~/.ssh/config

Host github.com

User git
IdentityFile ~/.ssh/deploy_key

絶対にやりたくない


.ssh/config に別 Host として登録する


~/.ssh/config

Host deploy1

Hostname github.com
User git
IdentityFile ~/.ssh/deploy1_key

Host deploy2
Hostname github.com
User git
IdentityFile ~/.ssh/deploy2_key


で、git clone の時は Host 名を指定する

$ git clone deploy1:organization/repository

$ git clone deploy2:organization/repository

とはいえ deploy key ごとに .ssh/config にエントリを増やしたくない。


GIT_SSH を使う

こんなスクリプトを作って、


git-ssh.sh

#!/bin/sh

exec ssh -oIdentityFile=~/.ssh/deploy_key "$@"

GIT_SSH 環境変数に指定する。

$ GIT_SSH=git-ssh.sh git clone git@github.com:...

とはいえ deploy key ごとに git-ssh スクリプトを作りたくはない。

※ GIT_SSH に指定するスクリプトに引数を指定したかったが、ダメ


git wrapper

なのでこんな git ラッパーを作るかんじになった。


git-ssh.sh

#!/bin/bash

usage_exit() {
echo "Usage: $0 [-i identity_file] -- [GIT ARGUMENTS]" 1>&2
exit 1
}

while getopts i:h OPT
do
case
$OPT in
i) IDENTITY_FILE=$OPTARG
;;
h) usage_exit
;;
esac
done
shift $((OPTIND - 1))

if [ -n "$IDENTITY_FILE" ]; then
tempfile=$(mktemp --dry-run)
cat <<EOF > $tempfile
#!/bin/sh
exec ssh -oIdentityFile=
${IDENTITY_FILE} "\$@"
EOF
chmod a+x $tempfile
GIT_SSH=$tempfile git $@
rm -f $tempfile
else
git $@
fi


これを使うと

$ git-ssh.sh -i ~/.ssh/deploy_key -- clone git@github.com:....

と出来るようになる。


GIT_SSH_COMMAND を使う

EDIT: 2017-08 thanks to mpyw

git 2.3 以降で環境変数 GIT_SSH_COMMAND で ssh コマンドを指定できるようになった

env GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone ...


git -c core.sshCommand を使う

EDIT: 2018-06 thanks to akirattii

EDIT: 2019-05 thanks to egtra

git 2.10.0 から git config core.sshCommand で ssh コマンドを指定できるようになった

。また、一時的に config 設定をしたい場合は git -c オプションを利用できる。

$ git -c core.sshCommand="ssh -i ~/.ssh/id_rsa_example -F /dev/null" clone ...