こんにちわ、北川です。
git の GIT_SSH を利用する機会がありましたのでご紹介したいと思います。
GIT_SSH
git のドキュメントにも記載されていますが、GIT_SSH 環境変数にラッパースクリプトを指定すると
git fetch , git push の際にラッパースクリプトが実行されます。
http://git-scm.com/docs/git#_other
通常、gitで別名の公開鍵を指定してやる場合など .ssh/config に指定する場合が多いと
思いますが、GIT_SSH を利用することで .ssh/config が利用できない環境で.ssh/config
と同等の設定が可能になります。
準備
サンプルとして bitbucket の gitリポジトリから チェックアウトしてみたいと思います。
前提として、bitbucketに 正しく公開鍵がセットされている必要があります。
正しくセットされていると ssh 接続すると下記のようになります。
1 2 3 4 |
$ ssh -T git@bitbucket.org -i .ssh/rsa-key.ppk logged in {ユーザ名}. You can use git or hg to connect to Bitbucket. Shell access is disabled. |
.ssh/config で設定
.ssh/configで設定する場合は、 .ssh/config に鍵の場所を記載します。
1 2 3 4 5 |
$ vi ~/.ssh/config *以下を追記 Host bitbucket.org IdentityFile ~/.ssh/rsa-key.ppk |
チェックアウトが成功すると下記のサンプルのようになります。
1 2 3 4 5 6 7 |
$ git clone git@bitbucket.org:{ユーザ名}/sample.git Cloning into 'sample'... remote: Counting objects: 167, done. remote: Compressing objects: 100% (112/112), done. remote: Total 167 (delta 35), reused 164 (delta 34) Receiving objects: 100% (167/167), 151.78 KiB | 76 KiB/s, done. Resolving deltas: 100% (35/35), done. |
GIT_SSH のテストもしたいので config を削除すると失敗します。
1 2 |
$ git clone git@bitbucket.org:{ユーザ名}/sample.git fatal: destination path 'sample' already exists and is not an empty directory. |
GIT_SSHで設定
まずは、GIT_SSH環境変数に指定するラッパースクリプトを作成します。
1 2 3 4 5 |
$ vi ~/gitssh.sh *以下を追加 #! /bin/sh ssh -i ~/.ssh/rsa-key.ppk "$@" |
ラッパースクリプトが出来たら GIT_SSH という名前で環境変数として指定します。
1 2 3 4 5 |
$ chmod 744 ~/gitssh.sh $ export GIT_SSH=~/gitssh.sh $ printenv GIT_SSH /home/kitagawa/gitssh.sh |
指定できたら config と同じように チェックアウトすると成功しました。
1 2 3 4 5 6 7 |
$ git clone git@bitbucket.org:{ユーザ名}/sample.git Cloning into 'sample'... remote: Counting objects: 167, done. remote: Compressing objects: 100% (112/112), done. remote: Total 167 (delta 35), reused 164 (delta 34) Receiving objects: 100% (167/167), 151.78 KiB | 101 KiB/s, done. Resolving deltas: 100% (35/35), done. |
まとめ
今回、GIT_SSH を利用したのは OpenShift で、.ssh/config に権限がなかったので
代替手段として GIT_SSH を利用しました。ドキュメントにも記載さてれいましたが
通常は config でよいと思いますが、GIT_SSH も合わせて知っているとイザという時に
役に立つかもしれません。