Git のリモートリポジトリから HTTP で pull するためのメモ

リモートサーバにある 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 が行われるというわけだ.
Pro Git - Pro Git 4.5 Git サーバー 一般公開 あたりを参照.