Git-over-http(スマートhttp)を使用してgitサーバーをセットアップする必要がありますが、オンラインで利用できるリソースは混乱しており、他のApache構成に混ざっていたり、詳細が欠けていたり、十分に明示されていません。
利用可能なリソースが不足していることに基づいて、この質問に自分で答えています。
最初に、git-over-httpにはgitとApacheの2つのコンポーネントがあることを理解する必要があります。これら2つは、git-http-backendという名前のスクリプトを介して接続されています。課題は、これら2つのコンポーネント間のインターフェイスを構成して、gitへのhttpリクエストがApacheによって転送されるようにすることです。
注:セキュリティはこのガイドの範囲外です。
ディストリビューションのパッケージマネージャーを使用してgitとApache2をインストールすることから始めます。
Apacheに必要なモジュールを追加して、git-over-httpを有効にします。これらは、cgi、alias、envです
_$ a2enmod cgi alias env
_
/etc/Apache2/httpd.conf
_にコピーします(含まれているものをすべて削除せずに)_<VirtualHost *:80>
SetEnv GIT_PROJECT_ROOT /data/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"/usr/lib/git/git-http-backend/$1"
Alias /git /data/git
<Directory /usr/lib/git>
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
_
/data/git
_の2つのオカレンスをサーバー上のgitリポジトリの親ディレクトリに置き換えます(まだリポジトリがない場合でも、配置するディレクトリを使用してください)また、_/usr/lib/git/git-http-backend
_をシステム上のgit-http-backendの場所に置き換えます。これは_$ find / -name git-http-backend
_を使用して見つけることができます
システム上で_REDIRECT_REMOTE_USER
_が有効な_REMOTE_USER
_を実際に上書きしている可能性があります。終了してもこのセットアップが機能しない場合は、その行を削除してみてください。
this sourceによると、Directoryタグ内の最後の2行を_Require all granted
_に置き換える必要がある場合がありますfor Apache 2.4以上。
$ Apache2ctl -k graceful
_これでApacheサーバーはセットアップされましたが、まだ完了していません。リポジトリのセットアップには、このセットアップが機能するかどうかに影響を与えるいくつかの重要な部分があります。
_$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www
_
ここでは、最後の行でリポジトリの所有者がApache2ユーザーに変更されることを理解することが重要です。このユーザーはシステムによって異なる場合があります。 Apacheユーザーを見つけるには、$ ps aux | egrep '(Apache|httpd)'
を実行します。次に、ユーザーのグループ名を見つけるには、_$ id user-name
_を実行します。私のシステムでは、ユーザーはwwwrunで、グループはwwwです。適宜交換してください。
リポジトリを使用するには、URLを知る必要があります。このセットアップでは、URLは http://server.domain/myrepo.git です
注:http sは機能しません。
クライアントからレポにアクセスするときは、リモートとして追加するだけです:
_$ git remote add Origin http://server.domain/myrepo.git
_
その後、他のgitリポジトリと同様に操作できます。
異なるアクセス権を持つ複数のプロジェクト
Gitoliteがありますが、複雑です...簡単な解決策は、Apache2 confでマクロを作成することです:
## Git root
SetEnv GIT_PROJECT_ROOT /opt/gitroot
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
SetEnv GITWEB_CONFIG /etc/gitweb.conf
## SMART Http
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
<Directory "/usr/libexec/git-core*">
Options +ExecCGI +Indexes
Order allow,deny
Allow from all
Require all granted
</Directory>
<Macro Project $repository $developers $users>
<LocationMatch "^/git/$repository.*$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/basic_auth
Require $developers $users
</LocationMatch>
<LocationMatch "^/git/$repository/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/basic_auth
Require $developers
</LocationMatch>
</Macro>
IncludeOptional /opt/git_access.conf
/opt/git_access.conf
Use Project test1 "admin john" "mike"
Use Project test2 "admin emma" "all granted"
そのため、gitプロジェクトtest1にはadminとjohnによる読み取り/書き込みアクセス権があり、mikeによる読み取り専用アクセス権があります。
プロジェクトtest2には、すべての認証済みユーザーによる読み取りアクセス権があります。
Git_access.confは、たとえば、あなたのプロジェクトやユーザーのデータベースからツールによって生成され、「service httpd reload」によってリロードできます。
Gitweb読み取りアクセス用の同じ設定の場合、/etc/gitweb.confに追加します:
$export_auth_hook = sub {
my $repo = shift;
my $user = $cgi->remote_user;
if($repo =~ s/\/opt\/gitroot\///) {
open FILE, '/opt/git_access';
while(<FILE>) {
if ($_ =~ m/Use Project $repo \"(.*)\" \"(.*)\"/)
{
my $users = $1 . ' ' . $2;
$users =~ s/all granted/$user/;
$users =~ s/user//;
if ( $users =~ m/$user/ ) {
return 1;
}
}
}
}
return 0;
};
この小さなgitwebフックは、現在のユーザーの読み取りアクセス権のないgitリポジトリを隠します(0を返します)。
そして、Apache2の構成に、古典的なgitweb conf:
## Gitweb
Alias /gitweb /var/www/git
<Directory /var/www/git>
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
Options +ExecCGI +Indexes +FollowSymlinks
AllowOverride None
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/basic_auth
Require valid-user
</Directory>
それが私の設定です。