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 $