日本語 ▾ トピック ▾ 最新バージョン ▾ gitweb は 2.50.0 で最終更新されました

名前

gitweb - Git ウェブインターフェース (Git リポジトリのウェブフロントエンド)

概要

gitweb を使い始めるには、Git リポジトリから git-instaweb[1] を実行します。これにより、ウェブサーバーが設定されて起動し、gitweb を指すウェブブラウザが起動します。

説明

Gitweb は Git リポジトリへのウェブインターフェースを提供します。その機能は次のとおりです。

  • 共通のルートを持つ複数の Git リポジトリを表示する。

  • リポジトリのすべてのリビジョンを閲覧する。

  • 任意のリビジョンでリポジトリ内のファイルの内容を表示する。

  • ブランチのリビジョンログ、ファイルとディレクトリの履歴を表示し、いつ、誰が、何を変更したかを確認する。

  • 任意のファイルの blame/annotation 詳細を表示する (有効になっている場合)。

  • 任意のブランチのコミットの RSS および Atom フィードを生成する。フィードは最新のウェブブラウザで自動検出可能。

  • リビジョンで変更されたすべてのものを表示し、一度に1つずつリビジョンをステップ実行して、リポジトリの履歴を表示する。

  • 特定の検索語と一致するコミットメッセージを持つコミットを検索する。

gitweb 自体を使用して参照される gitweb ソースコードについては、https://repo.or.cz/w/git.git/tree/HEAD:/gitweb/ を参照してください。

設定

gitweb の動作のさまざまな側面は、構成ファイル gitweb_config.perl または /etc/gitweb.conf を介して制御できます。詳細については、gitweb.conf[5] を参照してください。

リポジトリ

Gitweb は1つ以上の Git リポジトリからの情報を表示できます。これらのリポジトリはすべてローカルファイルシステム上にあり、共通のリポジトリルートを共有する必要があります。つまり、すべて単一の親リポジトリの下にある必要があります (ただし、「高度なウェブサーバー設定」セクションの「複数のプロジェクトルートを持つウェブサーバー設定」サブセクションも参照)。

our $projectroot = '/path/to/parent/directory';

$projectroot のデフォルト値は /pub/git です。GITWEB_PROJECTROOT ビルド設定変数を使用して、gitweb をビルドする際に変更できます。

デフォルトでは、$projectroot の下のすべての Git リポジトリが gitweb に表示され、利用可能です。プロジェクトのリストは、デフォルトで $projectroot ディレクトリを Git リポジトリ (より正確にはオブジェクトデータベース) についてスキャンすることによって生成されます。gitweb は作業領域には関心がなく、「ベア」リポジトリの表示に最適です。

gitweb でのリポジトリ名は、$projectroot に対するその $GIT_DIR (そのオブジェクトデータベース) へのパスです。したがって、リポジトリ $repo は "$projectroot/$repo" に見つかります。

プロジェクトリストファイルの形式

gitweb に $projectroot からファイルシステムをスキャンしてリポジトリを見つけさせる代わりに、$projects_list をプロジェクトのリスト (いくつかの追加情報を含む) を含むプレーンテキストファイルを指すように設定することで、事前に生成された表示可能なプロジェクトのリストを提供できます。

このファイルは次の形式を使用します

  • 1行に1つのレコード (プロジェクト/リポジトリ用)。行継続 (改行エスケープ) はサポートされていません。

  • 先頭と末尾の空白は無視されます。

  • 空白で区切られたフィールド。任意の連続した空白をフィールドセパレータとして使用できます (Perl の "split(" ", $line)" のルール)。

  • フィールドは、RFC 3986、セクション 2.1 (パーセントエンコーディング) で定義されている、またはむしろ「クエリ文字列エンコーディング」 (https://en.wikipedia.org/wiki/Query_string#URL_encoding を参照) に修正された URI エンコーディングを使用します。違いは、SP (" ") を "+" としてエンコードできることです (したがって、"+" もパーセントエンコードする必要があります)。

    予約文字は: "%" (エンコーディングに使用)、"+" (SPACE のエンコードに使用可能)、SP、TAB、LF を含む Perl で定義されているすべての空白文字 (レコード内のフィールドの区切りに使用)。

  • 現在認識されているフィールドは次のとおりです

    <リポジトリパス>

    リポジトリ GIT_DIR へのパス、$projectroot に対する相対パス

    <リポジトリ所有者>

    リポジトリ所有者として表示されます。できればフルネーム、またはメール、あるいはその両方

プロジェクトリストインデックスファイルは、gitweb から直接 project_index アクション (プロジェクトリストページの TXT リンク) を使用して生成できます。以下の「gitweb を使用したプロジェクトリストの生成」セクションも参照してください。

内容の例

foo.git       Joe+R+Hacker+<joe@example.com>
foo/bar.git   O+W+Ner+<owner@example.org>

デフォルトでは、このファイルはプロジェクトリストページに 表示される プロジェクトのみを制御します (正しく認識されない Git リポジトリを指すエントリは gitweb に表示されません)。プロジェクトがプロジェクトリストページに表示されない場合でも、gitweb URL を手動で作成することで表示できます。$strict_export 設定変数 (gitweb.conf[5] を参照) を true に設定することで、概要ページにも表示されるリポジトリのみを表示できます (つまり、プロジェクトリストファイルに明示的にリストされているプロジェクトのみがアクセス可能になります)。

gitweb を使用したプロジェクトリストの生成

GITWEB_CONFIG がデフォルトの Makefile 値、つまり gitweb_config.perl を持っていると仮定します。以下の内容を gitweb_make_index.perl ファイルに配置します

read_config_file("gitweb_config.perl");
$projects_list = $projectroot;

次に、GITWEB_LIST ビルド設定変数 (または gitweb 設定の $projects_list 変数) に適した形式でプロジェクトのリストを取得するための次のスクリプトを作成します。

#!/bin/sh

export GITWEB_CONFIG="gitweb_make_index.perl"
export GATEWAY_INTERFACE="CGI/1.1"
export HTTP_ACCEPT="*/*"
export REQUEST_METHOD="GET"
export QUERY_STRING="a=project_index"

perl -- /var/www/cgi-bin/gitweb.cgi

このスクリプトを実行し、その出力をファイルに保存します。このファイルはプロジェクトリストファイルとして使用でき、$projects_list をそのファイル名に設定できることを意味します。

Git リポジトリへのアクセス制御

デフォルトでは、$projectroot の下のすべての Git リポジトリは gitweb に表示され、利用可能です。ただし、gitweb がリポジトリへのアクセスをどのように制御するかを設定できます。

  • 「プロジェクトリストファイルの形式」セクションで説明されているように、プロジェクトリストファイルにリポジトリを選択的に含め、$projects_list gitweb 設定変数をそれに指すように設定することで、表示される プロジェクトを制御できます。$strict_export が設定されている場合、プロジェクトリストファイルは、利用可能な リポジトリも制御するために使用できます。

  • gitweb 設定ファイルの $export_ok 変数を使用して、明示的にエクスポートされたリポジトリのみを一覧表示し、表示できるように gitweb を設定できます。gitweb.conf[5] のマニュアルページを参照してください。$export_ok で指定されたファイルがオブジェクトデータベースに存在する場合 (ディレクトリに $export_ok という名前のマジックファイルがある場合)、gitweb はリポジトリを表示します。

    例えば、git-daemon[1] はデフォルトで (--export-all オプションが使用されない限り)、git-daemon-export-ok ファイルがあるリポジトリのみをプルすることを許可します。

    our $export_ok = "git-daemon-export-ok";

    を追加すると、gitweb は git:// プロトコルでフェッチできるリポジトリのみを表示し、アクセスを許可します。

  • 最後に、各リポジトリについて、エクスポート可能かどうかを判断するために呼び出される任意の perl サブルーチンを指定できます。このサブルーチンは、プロジェクト (リポジトリ) への絶対パスを唯一のパラメーターとして受け取ります (つまり、"$projectroot/$project")。

    たとえば、mod_perl を使用してスクリプトを実行し、リポジトリにダンプ HTTP プロトコル認証が設定されている場合、ユーザーがファイルを読み取る権限を持っている場合にのみアクセスを許可するために、次のフックを使用できます。

    $export_auth_hook = sub {
    	use Apache2::SubRequest ();
    	use Apache2::Const -compile => qw(HTTP_OK);
    	my $path = "$_[0]/HEAD";
    	my $r    = Apache2::RequestUtil->request;
    	my $sub  = $r->lookup_file($path);
    	return $sub->filename eq $path
    	    && $sub->status == Apache2::Const::HTTP_OK;
    };

リポジトリごとの gitweb 設定

Git リポジトリの GIT_DIR にファイルを作成するか、リポジトリ設定変数 (GIT_DIR/configgit-config[1] を参照) を設定することで、gitweb に表示される個々のリポジトリを設定できます。

リポジトリでは以下のファイルを使用できます。

README.html

gitweb プロジェクトの「概要」ページの <div> ブロック要素内に含まれる HTML ファイル (HTML フラグメント)。プロジェクトのより長い説明、リンク (たとえばプロジェクトのホームページへのリンク) の提供などに使用できます。これは XSS 防止がオフの場合にのみ認識されます ($prevent_xss が false の場合、gitweb.conf[5] を参照)。XSS 防止がオンの場合に README を安全に含める方法は、将来検討される可能性があります。

description (または gitweb.description)

プロジェクト (リポジトリ) の短い (プロジェクトリストページでは $projects_list_description_width に短縮され、デフォルトでは25文字です。gitweb.conf[5] を参照) 1行の説明。プレーンテキストファイル。HTML はエスケープされます。デフォルトでは

Unnamed repository; edit this file to name it for gitweb.

リポジトリ作成時にテンプレートから、通常は /usr/share/git-core/templates/ にインストールされます。gitweb.description リポジトリ設定変数を使用できますが、ファイルが優先されます。

category (または gitweb.category)

プロジェクトの単一行カテゴリ。$projects_list_group_categories が有効になっている場合、プロジェクトをグループ化するために使用されます。デフォルトでは (ファイルと設定変数が存在しない場合)、カテゴリなしのプロジェクトは $project_list_default_category カテゴリに配置されます。gitweb.category リポジトリ設定変数を使用できますが、ファイルが優先されます。

設定変数 $projects_list_group_categories$project_list_default_categorygitweb.conf[5] で説明されています。

cloneurl (または複数値の gitweb.url)

リポジトリ URL (クローンとフェッチに使用) を含むファイル、1行に1つ。プロジェクト概要ページに表示されます。複数値の gitweb.url リポジトリ設定変数を使用できますが、ファイルが優先されます。

これは、グローバルなプレフィックスベースの @git_base_url_list gitweb 設定変数 (詳細は gitweb.conf[5] を参照) のリポジトリごとの拡張/バージョンです。

gitweb.owner

gitweb.owner リポジトリ設定変数を使用して、リポジトリの所有者を設定できます。これはプロジェクトリストと概要ページに表示されます。

設定されていない場合、$projects_list が設定されていない場合 (gitweb が $projectroot をスキャンしてリポジトリを探す場合) は、ファイルシステムディレクトリの所有者 (GECOS フィールド、つまり getpwuid(3) の実名フィールドを介して) が使用されます。$projects_list がリポジトリのリストを含むファイルを指す場合、プロジェクト所有者はそのファイルの指定されたリポジトリの値にデフォルトで設定されます。

さまざまな gitweb.* 設定変数 (config 内)

詳細なリストと説明については、%feature ハッシュの説明を読んでください。gitweb.conf[5] の「gitweb 機能の設定」セクションも参照してください。

アクションと URL

Gitweb は path_info (コンポーネント) ベースの URL を使用することも、必要なすべての情報をクエリパラメータ経由で渡すこともできます。一般的な gitweb URL は5つのコンポーネントに分けられます。

.../gitweb.cgi/<repo>/<action>/<revision>:/<path>?<arguments>
repo

アクションが実行されるリポジトリ。

利用可能なすべてのプロジェクトをリストするアクションを除き、このパラメータが必要です。

action

実行されるアクション。repo が設定されていない場合は projects_list に、それ以外の場合は summary にデフォルト設定されます。

revision

表示されるリビジョン。デフォルトは HEAD です。

path

アクションが実行される <repository> 内のパス。それを必要とするアクションの場合。

arguments

アクションの動作を制御する引数。

一部のアクションでは、2つのリビジョン、場合によっては2つのパス名を指定する必要があります。最も一般的な形式では、このような path_info (コンポーネント) ベースの gitweb URL は次のようになります。

.../gitweb.cgi/<repo>/<action>/<revision-from>:/<path-from>..<revision-to>:/<path-to>?<arguments>

各アクションはサブルーチンとして実装され、%actions ハッシュに存在する必要があります。一部のアクションはデフォルトで無効になっており、機能メカニズムを介して有効にする必要があります。たとえば、blame ビューを有効にするには、gitweb 設定ファイルに次の行を追加します。

$feature{'blame'}{'default'} = [1];

アクション

標準アクションは次のとおりです。

project_list

利用可能な Git リポジトリをリスト表示します。これは、URL にリポジトリが指定されていない場合のデフォルトコマンドです。

summary

指定されたリポジトリの概要を表示します。これは、URL にアクションが指定されておらず、リポジトリのみが指定されている場合のデフォルトコマンドです。

heads
remotes

指定されたリポジトリ内のすべてのローカルブランチまたはすべてのリモートトラッキングブランチをリストします。

後者は、設定されていない限りデフォルトでは利用できません。

tags

指定されたリポジトリ内のすべてのタグ (軽量タグと注釈付きタグ) をリストします。

blob
tree

指定されたリビジョンの、指定されたリポジトリパス内のファイルとディレクトリを表示します。URL にアクションが指定されておらず、パスが指定されている場合のデフォルトコマンドです。

blob_plain

指定されたリポジトリの、指定されたパスとリビジョンにあるファイルの生データを返します。このアクションへのリンクは raw とマークされます。

blobdiff

同じファイルの2つのリビジョン間の差分を表示します。

blame
blame_incremental

ファイルの blame (annotation とも呼ばれる) 情報を表示します。行ごとに、その行が最後に変更されたリビジョンと、変更をコミットしたユーザーが表示されます。インクリメンタルバージョン (JavaScript が有効な場合に自動的に使用されるように設定されている場合) は、Ajax を使用して、指定されたファイルの内容に blame 情報を増分的に追加します。

このアクションはパフォーマンス上の理由からデフォルトで無効になっています。

commit
commitdiff

リポジトリ内の特定のコミットに関する情報を表示します。commit ビューはコミットに関する情報をより詳細に表示し、commitdiff アクションは指定されたコミットの変更セットを表示します。

patch

git-am[1] で適用するのに適した、プレーンテキストのメール形式でコミットを返します。

tag

特定の注釈付きタグ (タグオブジェクト) を表示します。

log
shortlog

指定されたブランチのログ情報 (コミットメッセージまたはコミットの件名のみ) を表示します (指定されたリビジョンから開始)。

shortlog ビューはよりコンパクトで、1行に1つのコミットを表示します。

history

指定されたリポジトリパス内のファイルまたはディレクトリの履歴を、指定されたリビジョン (デフォルトは HEAD、つまりデフォルトブランチ) から開始して表示します。

このビューは shortlog ビューに似ています。

rss
atom

リポジトリへの変更の RSS (または Atom) フィードを生成します。

ウェブサーバーの設定

このセクションでは、gitweb を実行するように一般的なウェブサーバーを設定する方法について説明します。すべての場合において、例の /path/to/gitweb は gitweb をインストールしたディレクトリであり、gitweb_config.perl が含まれています。

ここにリストされていないウェブサーバーを gitweb 用に設定した場合、将来のリリースに含めることができるように手順を送信してください。

CGI としての Apache

Apache は、gitweb がインストールされているディレクトリで CGI スクリプトをサポートするように設定する必要があります。それが /var/www/cgi-bin ディレクトリであると仮定しましょう。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

<Directory "/var/www/cgi-bin">
    Options Indexes FollowSymlinks ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

その設定では、リポジトリをブラウズするための完全なパスは次のようになります。

http://server/cgi-bin/gitweb.cgi

ModPerl::Registry を介した mod_perl を使用する Apache

mod_perl を gitweb で使用できます。このサポートを有効にするには、Apache::Registry (mod_perl 1.x の場合) または ModPerl::Registry (mod_perl 2.x の場合) をインストールする必要があります。

gitweb が /var/www/perl にインストールされていると仮定すると、次の Apache 設定 (mod_perl 2.x の場合) が適切です。

Alias /perl "/var/www/perl"

<Directory "/var/www/perl">
    SetHandler perl-script
    PerlResponseHandler ModPerl::Registry
    PerlOptions +ParseHeaders
    Options Indexes FollowSymlinks +ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

その設定では、リポジトリをブラウズするための完全なパスは次のようになります。

http://server/perl/gitweb.cgi

FastCGI を使用する Apache

Gitweb は Apache と FastCGI で動作します。まず、gitweb.cgi を gitweb.fcgi に名前変更、コピー、またはシンボリックリンクする必要があります。gitweb が /usr/share/gitweb ディレクトリにインストールされていると仮定しましょう。次の Apache 設定が適切です (未テスト!)。

FastCgiServer /usr/share/gitweb/gitweb.cgi
ScriptAlias /gitweb /usr/share/gitweb/gitweb.cgi

Alias /gitweb/static /usr/share/gitweb/static
<Directory /usr/share/gitweb/static>
    SetHandler default-handler
</Directory>

その設定では、リポジトリをブラウズするための完全なパスは次のようになります。

http://server/gitweb

高度なウェブサーバー設定

これらの例はすべてリクエスト書き換えを使用しており、mod_rewrite (または同等のもの。以下の例は Apache 用に記述されています) が必要です。

gitweb とフェッチ用の単一 URL

gitweb と http:// リポジトリの両方に1つの URL を使用したい場合は、次のように Apache を設定できます。

<VirtualHost *:80>
    ServerName    git.example.org
    DocumentRoot  /pub/git
    SetEnv        GITWEB_CONFIG   /etc/gitweb.conf

    # turning on mod rewrite
    RewriteEngine on

    # make the front page an internal rewrite to the gitweb script
    RewriteRule ^/$  /cgi-bin/gitweb.cgi

    # make access for "dumb clients" work
    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \
		/cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
</VirtualHost>

上記の設定では、公開リポジトリが /pub/git の下にあることを想定しており、クローン可能な Git URL および閲覧可能な gitweb インターフェースとして、http://git.domain.org/dir-under-pub-git として提供されます。次に、git-daemon[1]--base-path=/pub/git --export-all で開始すると、まったく同じパスで git:// URL を使用することもできます。

環境変数 GITWEB_CONFIG を設定すると、gitweb は指定されたファイル (つまり、この例では /etc/gitweb.conf) を gitweb の構成として使用します。上記の例では実際には必要ありません。構成ファイルが組み込み (gitweb のコンパイル時) の gitweb_config.perl または /etc/gitweb.conf とは異なる場所にある場合にのみ必要です。詳細、特に優先順位ルールに関する情報については、gitweb.conf[5] を参照してください。

例の書き換えルールを使用する場合、gitweb 設定ファイル (/etc/gitweb.conf の例に従う) に次のようなものが必要になる かもしれません

@stylesheets = ("/some/absolute/path/gitweb.css");
$my_uri    = "/";
$home_link = "/";
$per_request_config = 1;

しかし、最近では gitweb は必要に応じて HTML ベースタグを作成するはずなので (相対リンクのベース URI を設定するため)、自動的に機能するはずです。

複数のプロジェクトルートを持つウェブサーバー設定

複数のプロジェクトルートで gitweb を使用したい場合は、Apache 仮想ホストと gitweb 設定ファイルを次のように編集できます。

仮想ホスト設定 (Apache 設定ファイル内) は次のようになります。

<VirtualHost *:80>
    ServerName    git.example.org
    DocumentRoot  /pub/git
    SetEnv        GITWEB_CONFIG  /etc/gitweb.conf

    # turning on mod rewrite
    RewriteEngine on

    # make the front page an internal rewrite to the gitweb script
    RewriteRule ^/$  /cgi-bin/gitweb.cgi  [QSA,L,PT]

    # look for a public_git directory in unix users' home
    # http://git.example.org/~<user>/
    RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$	/cgi-bin/gitweb.cgi \
		[QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]

    # http://git.example.org/+<user>/
    #RewriteRule ^/\+([^\/]+)(/|/gitweb.cgi)?$	/cgi-bin/gitweb.cgi \
		 [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]

    # http://git.example.org/user/<user>/
    #RewriteRule ^/user/([^\/]+)/(gitweb.cgi)?$	/cgi-bin/gitweb.cgi \
		 [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]

    # defined list of project roots
    RewriteRule ^/scm(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
		[QSA,E=GITWEB_PROJECTROOT:/pub/scm/,L,PT]
    RewriteRule ^/var(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
		[QSA,E=GITWEB_PROJECTROOT:/var/git/,L,PT]

    # make access for "dumb clients" work
    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \
		/cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
</VirtualHost>

ここでは実際のプロジェクトルートがウェブサーバーから GITWEB_PROJECT_ROOT 環境変数経由で gitweb に渡されるため、gitweb 設定ファイル (上記の例では /etc/gitweb.conf) に次の行を追加する必要があります。

$projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git";

注意:これは各リクエストごとに設定する必要があるため、$per_request_config が false であるか、上記のコードが $per_request_config によって参照されるコード内に配置されている必要があります。

これらの設定は2つのことを可能にします。まず、サーバーの各Unixユーザー (<user>) は、次のURLで ~/public_git/ にある gitweb Git リポジトリを閲覧できるようになります。

http://git.example.org/~<user>/

この機能をサーバーで有効にしたくない場合は、2番目の書き換えルールを削除してください。

仮想ホストで既に mod_userdir を使用している場合、または「〜」を最初の文字として使用したくない場合は、2番目の書き換えルールをコメントアウトまたは削除し、必要に応じて次のいずれかのコメントを解除してください。

次に、/pub/scm//var/git/ にあるリポジトリは、http://git.example.org/scm/ および http://git.example.org/var/ を介してアクセスできるようになります。3番目と4番目のように書き換えルールを追加することで、必要なだけプロジェクトルートを追加できます。

PATH_INFO の使用

gitweb 設定ファイルに

$feature{'pathinfo'}{'default'} = [1];

と記述して gitweb で PATH_INFO の使用を有効にすると、サーバーを次のような形式の URL を消費および生成するように設定できます。

http://git.example.com/project.git/shortlog/sometag

つまり、gitweb.cgi 部分なしで、次のような設定を使用します。この設定では、/var/www/gitweb がウェブサーバーの DocumentRoot であり、gitweb.cgi スクリプトと補足的な静的ファイル (スタイルシート、ファビコン、JavaScript) を含んでいると仮定します。

<VirtualHost *:80>
	ServerAlias git.example.com

	DocumentRoot /var/www/gitweb

	<Directory /var/www/gitweb>
		Options ExecCGI
		AddHandler cgi-script cgi

		DirectoryIndex gitweb.cgi

		RewriteEngine On
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
	</Directory>
</VirtualHost>

書き換えルールは、既存の静的ファイルが適切に提供されることを保証し、その他のURLはPATH_INFOパラメーターとしてgitwebに渡されます。

注意: この場合、@stylesheets$my_uri$home_link に特別な設定は必要ありませんが、プロジェクトの .git ディレクトリへの「ダムクライアント」アクセス (「gitweb とフェッチ用の単一 URL」セクションで説明) を失います。後者の考えられる回避策は次のとおりです。プロジェクトのルートディレクトリ (例: /pub/git) に、.git 拡張子なしでプロジェクトに名前を付け (/pub/git/project.git の代わりに /pub/git/project など)、Apache を次のように設定します。

<VirtualHost *:80>
	ServerAlias git.example.com

	DocumentRoot /var/www/gitweb

	AliasMatch ^(/.*?)(\.git)(/.*)?$ /pub/git$1$3
	<Directory /var/www/gitweb>
		Options ExecCGI
		AddHandler cgi-script cgi

		DirectoryIndex gitweb.cgi

		RewriteEngine On
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
	</Directory>
</VirtualHost>

追加の AliasMatch により、次のようになります。

http://git.example.com/project.git

はプロジェクトのGitディレクトリへの生のアクセスを提供し (プロジェクトをクローンできるように)、一方

http://git.example.com/project

は人間が読めるgitwebアクセスを提供します。

この解決策は100%完璧ではありません。つまり、プロジェクトに git/ で始まる名前付き参照 (ブランチ、タグ) がある場合、次のようなパスは

http://git.example.com/project/command/abranch..git/abranch

404 エラーで失敗します。

バグ

バグや機能のリクエストは、メールの件名に「gitweb」と記載して git@vger.kernel.org まで報告してください。

関連項目

gitweb/README, gitweb/INSTALL

GIT

git[1]スイートの一部

scroll-to-top