home / uni / git-cygsshd GitとCygwinのsshd

 GitではリモートのPCから手元のPCに対してpullできると便利なことがあります。 たとえば、ひとつのソースコードをWindows・Linux・FreeBSDの32ビット・64ビット(計6環境)で動作の確認をしているときに、それぞれの環境でちょっとした不具合が出たとします。 Subversionなどの集中型のSCMの場合はその都度(ただひとつのリポジトリである中央リポジトリに)commitするわけですが、gitの場合は動作確認の終わった環境から次に確認したい環境へと直接pullしていけば、中央リポジトリに頼らずに確認を進められます。 ぐるっと一周しても不具合が出なくなったら、その時点で中央リポジトリにpushすればいいわけです。

 UNIX系のマシンではsshdを立ち上げていないことの方が珍しいでしょうが、Windowsでは立ち上がっていることの方が珍しいでしょう。 一方で --bare ではないリポジトリにpushしようとすると怒られます(両者が同期していればpushできます)。 つまり、Windows系のマシンに対してpullするのが問題になるわけです。 そこで、Win32版の(Cygwin版ではない、いわゆるmsysgit)Gitと、Cygwinのsshdを使ってプチGitサーバーを立ち上げてみました。

 Win32版Git(msysgit)は「Run Git from the Windows Command Prompt」を選んでインストールしてあります。 この場合、Git関連のパスはC:\Program Files\Git\cmdだけに通った形になります。 また、前提としてCygwinでsshdが動いている必要があります。 pullするときだけ動いていればいいので、コマンドラインから -De を付けて起動するのがいいでしょう。 とりあえずパスをごっそり削除して起動してみます。

cygwin$ PATH= /usr/sbin/sshd -De
/usr/sbin/sshd.exe: error while loading shared libraries: ?: 
cannot open shared object file: No such file or directory

まぁ、当たり前です。 共有ライブラリは/usr/binにあるので、パスを追加します。

cygwin$ PATH=/usr/bin /usr/sbin/sshd -De

とりあえずこれで他のホストからログインできるようになります。 しかし、Gitでpullしてみると、

unix$ git pull
bash: git-upload-pack: command not found
fatal: Could not read from remote repository.

Cygwin側でgit-upload-packが実行できない、と怒られます。 調べてみると

cygwin$ find /prg/Git -name git-upload-pack.exe
/prg/Git/libexec/git-core/git-upload-pack.exe

にあるので、パスを追加します。 面倒くさいのでln -s '/cygdrive/c/Program Files' /prgとシンボリックリンクが張ってあります。

cygwin$ PATH=/usr/bin:/prg/Git/libexec/git-core /usr/sbin/sshd -De
unix$ git pull
/cygdrive/c/Program Files/Git/libexec/git-core/git-upload-pack.exe: 
error while loading shared libraries: libiconv-2.dll: 
cannot open shared object file: No such file or directory
fatal: Could not read from remote repository.

libiconv-2がないと怒られました。 これは、

cygwin$ find /prg/Git -name libiconv-2.dll
/prg/Git/bin/libiconv-2.dll

にあるので、

cygwin$ PATH=/usr/bin:/prg/Git/libexec/git-core:/prg/Git/bin /usr/sbin/sshd -De
unix$ git pull
From cygwin:git-test
   8ae421b..7d1ce75  master     -> origin/master
Updating 8ae421b..7d1ce75
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)

うまくいきました。 .bashrcあたりでaliasにしておくといいでしょう。 gitsshdみたいな名前で。 この方法(PATH=などを前に付けてコマンドを実行)は、環境変数の影響があるのは実行したコマンドだけで、元の環境に影響がありません。 sshdをCtrl+Cで止めたあとは普通に使い続けることができます。

 なお、sshdはCygwinですが、GitがWin32版なので、URLをフルパスで指定する場合はWin32パスになります。 混乱しないようにご注意を。 ドライブ名からフルパスで指定しようとすると、

unix$ git clone user@cygwin:c:/git/git-test
Cloning into 'git-test'...

というちょっとイヤラシイ指定の仕方になります。 ログインすると

unix$ ssh user@cygwin pwd
/home/user

とユーザーのホームディレクトリに移るようなので、リポジトリがホームと同じドライブにあれば、

unix$ git clone user@cygwin:/git/git-test
Cloning into 'git-test'...

と普通に/から始めれば大丈夫です。


Copyright (C) 2012 You SUZUKI

$Id: git-cygsshd.htm,v 1.1 2012/12/17 18:27:16 you Exp $