home / uni / gitd Gitのサーバーあれこれ

home / uni / gitd SSH

 SSHデーモンが動いていて、ログインできればOK。 URLはuser@host:/path/to/repoでよい。 :のあとの/を書かなければホームディレクトリからの相対パスになる。 頭にスキームを付けてssh://user@host:port/path/to/repoと書くこともできる。 この場合は必ずフルパスになるが、ポートを指定できる。

home / uni / gitd HTTP

 古いプロトコルとスマートなプロトコルのふたつがあるらしい。 HTTPに共通な特徴は以下の通り。

古い方(ダムHTTP)

 簡単なのは古い方。 HTTPデーモンさえ動いていればCGI不要で使える。 基本的には、

だけ。 アクセスするURLはhttp://host/path/to/repo

 前者はhttpd.confなどでURLパスをリポジトリのあるディレクトリにマッピングするか、リポジトリをHTTPのドキュメントルートの下に移すか、シンボリックリンクを張ってしまえばよい。 パーミッションを調整して、HTTPデーモンがリポジトリ内のファイルを読めるようにしておく。

 後者はリポジトリ内のhooks/post-update.samplepost-updateにリネームして、パーミッションの実行ビットを立てるだけ。 このスクリプトはコミット時に実行されるので、初回は手動で(その場で)実行しておくとよい。

 pushはできないので、開発者にはsshアカウントを作ってsshでpush、公開にはHTTPという使い方になるだろう。

新しい方(スマートHTTP)

 CGIを設置する必要があるが、ファイルをまとめて圧縮してやり取りするのでcloneが速い。 CGI自体はgitのバイナリリリースに同梱されていて、git-http-backendという名前。 うちのディストリでは/usr/lib/gitの下に入っていた。 CGIの設定はこんな感じ。 環境変数を設定する必要があるので、mod_envが必要。 うちはなぜかこれがロードされていなかった(mod_setenvifはロードされてたのに)。

<VirtualHost *>
    ScriptAlias /git/ "/usr/lib/git/git-http-backend/"
    SetEnv GIT_PROJECT_ROOT /pub/git
    SetEnv GIT_HTTP_EXPORT_ALL
    <Files git-http-backend>
       Require all granted
    </Files>
</VirtualHost>

 /pub/gitというのはこのあと説明するGitWebが使うデフォルトのリポジトリ置き場。

 pushしたい場合はリポジトリを共有リポジトリとして初期化してパーミッションを調整しておく。 誰でもpushできるようにするにはリポジトリの設定でhttp.receivepacktrueに設定しておく必要がある。 このパラメータがfalse(デフォルト)だと認証されたユーザーだけがpushできる状態になるが、認証されたかどうかはREMOTE_USER環境変数で見ているらしい。 nginxのfastcgi_paramなどには設定が入っていないので、nginxの設定ファイルなどでfastcgi_param REMOTE_USER $remote_user;のように書いておく必要がある。

 pushは認証ユーザーのみ、cloneは誰でも、という認証のかけ方も可能だが、これはHTTPサーバーの機能に依存。 マニュアルにはApacheの例が載っているが、指定されたURLからアップロードかダウンロードかを判断してアクセス制御する方式なので若干ハナモゲラ。 だったらLocationで制御したほうが楽なんじゃないかと思う。 その他、man git-http-backendすると有益な情報を得られる。

home / uni / gitd GitWeb

 リポジトリブラウザCGI。 gitのソースにくっついてくる。 CGIの動くHTTPデーモンが必要。 他にもいろいろ要件があるけど、gitweb/INSTALLに書いてあるので各自で確認。 結局、やらなければいけない作業は、

 make ... install-gitwebでは少なくとも以下の変数を設定する必要があるだろう。 gitweb/INSTALLを見ると、まずmake ... gitwebするように書いてあるが、今のところ、これらの変数はinstall-gitwebのときにも指定しないとダメなので、make ... gitwebにはあまり意味がないように思う。

prefix
 gitの実行ファイルの置いてあるディレクトリの親ディレクトリに設定する。 普通は/usr。 gitをソースから入れた人はその時の設定、例えば/usr/local。 ちゃんと指定しないとPATH環境変数の最初の要素を持って行ってしまう。
gitwebdir
 CGIスクリプトのインストール先。 HTTPデーモンがCGIを実行できるディレクトリ。
GITWEB_PROJECTROOT
 リポジトリの置いてあるディレクトリ。 リポジトリそのものではなく、その親ディレクトリ。 ブラウザからGitWebのトップページを見ると、このディレクトリに入っているリポジトリがプロジェクト一覧として表示される。

 リポジトリがあちらこちらに散らばっている場合、新しくひとつディレクトリを作って、その中に各リポジトリへのシンボリックリンクを押しこんでおけばよい。 この戦略を採る場合、この変数のデフォルトは/pub/gitなので、/pub/gitディレクトリを作ってそこにシンボリックリンクを押しこめば、この変数は設定しなくてよい。

 最後に、HTTPデーモンからCGIを叩けるようにする。 Pro Gitにはいろいろ書いてあるが、とにかくCGIが実行できるようにすればいいので、Apache httpdならこんな感じ。

<VirtualHost *>
    <Directory "/path/to/gitweb">
        Require all granted
        Options ExecCGI
        AddHandler cgi-script cgi
        DirectoryIndex gitweb.cgi
    </Directory>
</VirtualHost>

あとはHTTPデーモンを再起動して、gitwebdirで指定したディレクトリに対応するURLをブラウザから叩けばよい。 Ubuntu(bionic)のnginxではCGI.pmが見つからなくて、libcgi-pm-perlをインストールする必要があった。

 Descriptionフィールドにはリポジトリ内のdescriptionファイルの内容の最初の1行が表示されている。 このファイルはpushして更新したりはできないので、手作業で更新する必要がある。 ベアリポジトリでなければシンボリックリンクを張っておく手もあるけど。

 cloneurlというファイルを作っておくとcloneするURLを表示してくれる。 このファイルは2行以上にすることもでき、HTMLのタグを含めることもできる。 <A>を埋めておくとよいだろう。 その他、man gitwebすると有益な情報を得られる。


Copyright (C) 2018-2020 akamoz.jp

$Id: git-servers.htm,v 1.10 2020/02/06 16:06:27 you Exp $