リモートサーバにある Git リポジトリから HTTP (WebDAV) 経由で pull したり clone を作ったりする場合の注意点について,おぼえがき.
注意: Git は最近使い始めたばかりなので,正確でないかもしれません.
一般的な前準備(参考程度に) †
リモートサーバ(apache2/Debian を仮定)で WebDAV を有効にして,リポジトリのパスを /git にエイリアスし /git の認証設定を行う設定ファイルを
Alias /git /home/akihiko/git <Location /git> Options Indexes # DAV on AuthType Basic AuthName "Git repository" AuthUserFile 適当な .htpasswd ファイルのパス Require valid-user </Location>
こんな感じで書いて /etc/apache2/mods-enabled/dav_git.conf あたりに保存, apache2 を再起動すればOK(だったと思う). 記憶があいまいなので gitレポジトリをhttpで公開する あたりを参照.
ちなみに,サーバのリポジトリの作成は,既に作業リポジトリがどこかにある場合,そこから --bare オプション付きで clone を作ればOK.リポジトリの親ディレクトリ(上の例だと /home/akihiko/git)上で
git clone --bare 作業リポジトリ HOGE.git
とすれば,HOGE.git が作成される. アリスとボブのサーバー、git pushをちゃんと理解したい! あたりを参照. なお,HTTP経由ではファイルを変更させたくないので, HOGE.git の所有者/グループを www-data:www-data に変更したりはしない.
本題(pull する) †
このリポジトリから ssh 経由で pull する場合だと,
git pull ssh://USER@SERVER/home/akihiko/git/HOGE.git master
とかやればいいのだが,同じ感覚で
git pull http://USER@SERVER/git/HOGE.git master
とやると(この USER は ssh のユーザとは異なる.前述の AuthUserFile で定義したもの),
fatal: http://USER@SERVER/git/HOGE.git/info/refs not found: did you run git update-server-info on the server?
というエラーが出る.これは,サーバのリポジトリに info/refs という補助ファイルがないためで,サーバのリポジトリディレクトリ(上の例だと /home/akihiko/git/HOGE.git)で,
git update-server-info
を実行してやる必要がある.そうすると, pull できるようになる.
ここで注意しなければならないのは,
サーバのリポジトリを(push などで)更新するたびに git update-server-info を実行しないと,最新の情報を pull できない
らしいことだ. pull でなくて, clone であっても同じ.更新のたびに git update-server-info を実行しないと,古いファイルしか pull されない.
さて,更新のたびに git update-server-info を実行するのは面倒なので, 自動化する.サーバのリポジトリディレクトリに行くと, hooks/post-update.sample というファイルがある.この名称を hooks/post-update に変更する.このファイルは更新が行われるたびに実行されるスクリプトで,中身は
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git-update-server-info
となっている.つまり更新のたびに git update-server-info が行われるというわけだ.