git: レンタルサーバーに cgit で構築する Web インターフェイス

Posted on 2021/02/07 in tech

cgit とは

kernel.org で利用されている git リポジトリの Web インターフェイスです。

cgit という名前からも察せられるように、 cgi で動きます。

さくらのレンタルサーバー で試しに cgit をセットアップしたところスムーズにセットアップできたのですが、 設定で少々詰まったところもあり、また日本語どころか英語の情報もあまりなかったので、メモがてら書いていきます。

この記事で書か ない こと

レンタルサーバー上の設定を考慮しているので、以下のようなことは書いてません。

  • Apache のインストール方法
  • httpd.conf (apache2.conf) の設定方法

また、ssh でのログイン方法なども書いてません。

書くこと

逆に、以下のようなことは書きます。

  • Makefile の修正例
  • htaccess の例
  • cgit の設定方法とよく使われるであろう設定

注意事項

cgit は C 言語で書かれているため、cgi はバイナリで提供されます。

バイナリ実行形式の cgi が禁止されているレンタルサーバーには、インストールしないようご注意ください。

前提

サーバー

  • レンタルサーバーに ssh でログインできること。
  • 各種コマンドはレンタルサーバー上で実行することを想定しています。

リポジトリへの push

cgit はサーバー上のリポジトリを 一覧・参照するため の Web インターフェイス です。

つまり、 読み取り専用 です。

サーバー上のリポジトリへ git push するためには、ssh など別の手段を使います。
詳しくは下記をご参考ください。

セットアップ

ssh でレンタルサーバーにログインします。

以下の例では、ドキュメントルートを /home/niceuser/www/example としています。

ソースのダウンロード

この記事の例ではホームディレクトリ直下に local フォルダを作成して各種作業ファイルを展開していきます。

cgit のリポジトリ URL は こちら から取得しました。1 2

$ mkdir -p local/src
$ cd local/src
$ git clone https://git.zx2c4.com/cgit 

以降この記事ではデフォルトのブランチをそのままビルドしていきます。

Makefile の修正

root 権限不要なフォルダ上にインストールできるよう、 cgit/Makefile を修正します。

$ cd cgit/
$ vi Makefile

以下は修正後の差分例です。

  • ホームディレクトリが /home/niceuser
  • ドキュメントルートが /home/niceuser/www/example

となるように書いているので、適宜読み換えてください。

$ git diff
diff --git a/Makefile b/Makefile
index 6dfc003..6bcdd5b 100644
--- a/Makefile
+++ b/Makefile
@@ -2,11 +2,11 @@ all::

 CGIT_VERSION = v1.2.3
 CGIT_SCRIPT_NAME = cgit.cgi
-CGIT_SCRIPT_PATH = /var/www/htdocs/cgit
+CGIT_SCRIPT_PATH = /home/niceuser/www/example
 CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH)
-CGIT_CONFIG = /etc/cgitrc
-CACHE_ROOT = /var/cache/cgit
-prefix = /usr/local
+CGIT_CONFIG = /home/niceuser/local/etc/cgitrc
+CACHE_ROOT = /home/niceuser/local/var/cache/cgit
+prefix = /home/niceuser/local
 libdir = $(prefix)/lib
 filterdir = $(libdir)/cgit/filters
 docdir = $(prefix)/share/doc/cgit

ディレクトリの作成

Makefile に記載したディレクトリパスが存在しないとエラーになるので、ディレクトリを作成しておきます。

$ mkdir -p ~/local/etc ~/local/var/cache/cgit

ビルド・インストール

あとは普通に make するだけです。

$ make install

ただし、さくらのレンタルサーバーは FreeBSD である関係で、GNU Make の文法で書かれている cgit の Makefile ではエラーになります。

幸い gmake 3 がインストールされているので、こちらを使いましょう。

$ gmake install

Makefile 中の CGIT_SCRIPT_NAMEcgit.cgi から変えていなければ、 さくらのレンタルサーバーでは、以上でインストールが完了し、特に設定不要で Web にアクセスできるはずです。4

レンタルサーバーによっては、.cgi ファイルのために、.htaccess へ以下のような設定が必要になるかも知れません。5

Options +ExecCGI
AddHandler cgi-script cgi

設定ファイル

Makefile の変数 CGIT_CONFIG に指定していたファイルを作成し、各種設定を行えます。
各種設定値の詳細や記述方法などは、cgit リポジトリ直下のテキストファイル cgitrc.5.txt を参考にしてください。

本記事では基本的な設定のみ触れます。

グローバル設定

全リポジトリに対するグローバルな設定と、個別のリポジトリのための設定があります。

グローバル設定を中心に見ていきます。

readme

readme=:README.md
readme=:readme.md
readme=:readme.txt
readme=:README
readme=:readme
readme=:INSTALL.md
readme=:install.md

cgit ページの「about」タブに表示するファイルのファイル名を指定します。 一番最初にファイル名が一致したファイルが表示されます。

設定値を hoge:README とすると、hoge ブランチ直下の README ファイルが about タブに利用されます。

上記例のようにブランチ(コロンの左側)を省略すると、デフォルトブランチが選択されます。

enable-http-clone

enable-http-clone=1

http プロトコルによる git clone を可能にします。

clone-url

clone-url=git://foo.org/$CGIT_REPO_URL http://$HTTP_HOST$SCRIPT_NAME/$CGIT_REPO_URL

cgit の画面に見せる リポジトリ URL です。スペース区切りで複数指定できます。 6

enable-http-clone を有効化している場合、(htaccess などで URL パスを変更していなければ) http://$HTTP_HOST$SCRIPT_NAME/$CGIT_REPO_URL という設定が、クローン可能な URL に相当します。

scan-path

scan-path=/home/niceuser/git-data

この設定で /home/niceuser/git-data 内に作成したベアリポジトリは cgit 上にリストされます。

敢えて最後にこの設定を書きましたが、前述の readme 設定などは scan-path 設定の 前に書かないと有効化されません7

リポジトリごとの設定

以下のように個別のリポジトリの設定も記載できます。cgitrc.5.txt ファイル内 EXAMPLE CGITRC FILE セクションから転載します。

repo.url=foo
repo.path=/pub/git/foo.git
repo.desc=the master foo repository
repo.owner=fooman@example.com
repo.readme=info/web/about.html

リポジトリごとの cgitrc ファイル

グローバル設定の scan-path で自動的に読み込まれたリポジトリ内にcgitrc ファイルを配置すると、 そのリポジトリ固有の設定となります。

この場合、前述の個別設定のようなプレフィックス repo. を削除して記載する必要があります。

つまり先程の設定を個別リポジトリの cgitrc に記載する場合は以下のようになります。

url=foo
path=/pub/git/foo.git
desc=the master foo repository
owner=fooman@example.com
readme=info/web/about.html

認証

cgit それ自体に認証機能はないので、Basic 認証なりを設定する8 か、 auth-filter 9 を設定します。auth-filter の詳しい内容は本記事の趣旨を超えてくるので、割愛します。

URL の変更

デフォルトだと http://git.example.com/cgit.cgi/ のように、 cgi ファイル名が URL に含まれます。

htaccess に以下の設定をすることで、URL から cgit.cgi を削除できます。10

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /cgit.cgi/$1

この場合、clone-url に設定すべき URL は http://$HTTP_HOST/$CGIT_REPO_URL になります($SCRIPT_NAME が不要です)。

一体いつから ― GitHub が スタンダード だと錯覚していた?

タイトルは言いたかっただけです。はい。

リナックスカーネルの開発から git は生まれました。11

git のネイティブ機能には Web インターフェース GitWeb が組み込まれ、kernel.org でも利用されていました。

GitWeb はやがてパフォーマンスの面で問題が指摘されるようになり12、そして cgit が生まれ13 14、 kernel.org で採用されるに至りました。15

正統派にこだわる硬派なあなたには、cgit や GitWeb がお似合いかも知れません。

こういうときどうするの?

プルリクエストを受け付ける(プロジェクトの運営)

プロジェクト運営については以下が参考になると思います。

メールはスケール可能なインテグレーション方法

GitHub や GitLab などの ホスティングサービス上でプルリクエストを扱わない 、というだけで 前時代的 と考える方もいるかも知れません。

考え方は人それぞれですが、参考として LWN.net の記事を貼っておきます。

この記事では、 言語やインフラ状況などが多様な世界中の開発者が関わる開発では、むしろメールでやりとりする方がスケールでき、実際非常に速いスループットでパッチを取り込んでいる といったことが書かれています。

メンテナの管理

複数人でリポジトリを管理したい(メンテナを追加したい)場合は、Gitolite が利用できそうです。これも kernel.org で採用されています16

機会があったら試して記事にできたらなと思います。


  1. こちら から任意のバージョンをダウンロードすることもできます 

  2. --depth 1 オプションで最低限のソースを取得する形で問題ありませんが、簡略化して書いてます。 

  3. Make- GNU Project - Free Software Foundation 

  4. さくらのレンタルサーバーでは、.cgi 拡張子は自動でcgi プログラムとして扱われます 

  5. CGI の例 - Apache チュートリアル: .htaccess ファイル - Apache HTTP サーバ バージョン 2.2 

  6. ミラーリングリソースの URL などを想定しているものと思われます。 

  7. Viewing Repository "About" Tab 

  8. https の利用を前提にし、セキュリティの配慮を必ず行ってください。 

  9. cgitrc.5.txt - cgit - A hyperfast web frontend for git repositories written in C. 

  10. apache - htaccess: remove cgit.cgi from path - Stack Overflow 

  11. Git - Git略史 

  12. Re: kernel.org mirroring (Re: [GIT PULL] MMC update) - Linus Torvalds 

  13. Re: kernel.org mirroring (Re: [GIT PULL] MMC update) - Lars Hjemli  

  14. [ANNOUNCE] CGit v0.1-pre - Lars Hjemli 

  15. [gitweb] Removed reference to git.kernel.org - Fredrik Gustafsson 

  16. overview - Gitolite