Git
英語 ▾ トピック ▾ 最新バージョン ▾ gitweb 最終更新日: 2.47.0

名前

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

概要

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

説明

Gitwebは、Gitリポジトリへのウェブインターフェースを提供します。その機能には以下が含まれます。

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

  • リポジトリのすべてのリビジョンの参照。

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

  • ブランチのリビジョンログ、ファイルとディレクトリの履歴の表示、変更内容、日時、担当者の確認。

  • 任意のファイルのブラム/アノテーションの詳細の表示(有効になっている場合)。

  • 任意のブランチのコミットのRSSフィードとAtomフィードの生成。フィードは最新のウェブブラウザで自動検出されます。

  • リビジョンで変更されたすべての内容の表示、およびリビジョンを1つずつステップ実行して、リポジトリの履歴を表示。

  • コミットメッセージが特定の検索語句に一致するコミットの検索。

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

設定

gitwebの動作の様々な側面は、設定ファイル `gitweb_config.perl` または `/etc/gitweb.conf` を通じて制御できます。gitweb.conf[5] を参照してください。

リポジトリ

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

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つのレコード(プロジェクト/リポジトリ用)。行の継続(改行のエスケープ)はサポートしていません。

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

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

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

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

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

    <repository path>

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

    <repository owner>

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

プロジェクトインデックスアクション(プロジェクトリストページの_TXT_リンク)を使用して、gitwebから直接プロジェクトリストインデックスファイルを生成できます。「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]マニュアルページを参照してください。これがtrueに評価されると、gitwebはこのファイル(`$export_ok`という名前のマジックファイルがあるディレクトリ)がそのオブジェクトデータベースに存在する場合にのみリポジトリを表示します。

    たとえば、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/config`、git-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`が有効になっている場合、プロジェクトをグループ化するのに使用されるプロジェクトの1行のカテゴリです。デフォルト(ファイルと設定変数が存在しない場合)、未分類のプロジェクトは`$project_list_default_category`カテゴリに配置されます。`gitweb.category`リポジトリ設定変数を使用できますが、ファイルの方が優先されます。

設定変数`$projects_list_group_categories`と`$project_list_default_category`については、gitweb.conf[5]を参照してください。

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

リポジトリURL(クローンとフェッチに使用)を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.*`設定変数(設定内)

`%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

アクションが実行される``内のパス(必要なアクションの場合)。

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情報(アノテーションとも呼ばれます)を表示します。行単位で、その行が最後に変更されたリビジョンと変更をコミットしたユーザーを表示します。インクリメンタルバージョン(JavaScriptが有効になっている場合、設定されていれば自動的に使用されます)はAjaxを使用して、指定されたファイルのコンテンツにblame情報を段階的に追加します。

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

commit
commitdiff

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

patch

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

tag

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

log
shortlog

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

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

history

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

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

rss
atom

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

Webサーバーの設定

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

ここで説明されていないWebサーバーでgitwebを設定した場合は、手順を送信してください。今後のリリースに含めることができます。

ApacheをCGIとして

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

gitwebでmod_perlを使用できます。このサポートを有効にするには、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

高度なWebサーバー設定

これらの例はすべてリクエストの書き換えを使用しており、`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`下にあり、`http://git.domain.org/dir-under-pub-git`として提供されると想定しています。これは、クローン可能なGit URLと参照可能なgitwebインターフェースの両方として機能します。その後、`--base-path=/pub/git --export-all`を使用してgit-daemon[1]を起動すると、まったく同じパスで`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 baseタグを作成するため(相対リンクのbase URIを設定するため)、自動的に動作するはずです。

複数のプロジェクトルートを使用したWebサーバー設定

複数のプロジェクトルートで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>

ここでは、実際のプロジェクトルートがWebサーバーから`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`がWebサーバーのDocumentRootであり、gitweb.cgiスクリプトと補足的な静的ファイル(スタイルシート、favicon、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に対して特別な設定は必要ありませんが、「Single URL for gitweb and for fetching」セクションで説明されているように、プロジェクトの.gitディレクトリへの「ダミークライアント」アクセスは失われます。後者に対する回避策としては、プロジェクトのルートディレクトリ(例:/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エラーで失敗します。

バグ

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

関連情報

gitweb/READMEgitweb/INSTALL

Git

git[1]スイートの一部

scroll-to-top