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 サーバー 一般公開 あたりを参照.