web-dev-qa-db-ja.com

http経由でgitをセットアップする方法は?

Git-over-http(スマートhttp)を使用してgitサーバーをセットアップする必要がありますが、オンラインで利用できるリソースは混乱しており、他のApache構成に混ざっていたり、詳細が欠けていたり、十分に明示されていません。

利用可能なリソースが不足していることに基づいて、この質問に自分で答えています。

18
Marmoy

最初に、git-over-httpにはgitとApacheの2つのコンポーネントがあることを理解する必要があります。これら2つは、git-http-backendという名前のスクリプトを介して接続されています。課題は、これら2つのコンポーネント間のインターフェイスを構成して、gitへのhttpリクエストがApacheによって転送されるようにすることです。

注:セキュリティはこのガイドの範囲外です。

  1. ディストリビューションのパッケージマネージャーを使用してgitとApache2をインストールすることから始めます。

  2. Apacheに必要なモジュールを追加して、git-over-httpを有効にします。これらは、cgi、alias、envです

_$ a2enmod cgi alias env
_
  1. 以下を_/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>
_
  1. ここで、_/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以上。

  1. Apacheサーバーを再起動します:_$ Apache2ctl -k graceful_

これでApacheサーバーはセットアップされましたが、まだ完了していません。リポジトリのセットアップには、このセットアップが機能するかどうかに影響を与えるいくつかの重要な部分があります。

  1. リポジトリを設定します。
_$ 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です。適宜交換してください。

  1. レポを使用する

リポジトリを使用するには、URLを知る必要があります。このセットアップでは、URLは http://server.domain/myrepo.git です

注:http sは機能しません。

クライアントからレポにアクセスするときは、リモートとして追加するだけです:

_$ git remote add Origin http://server.domain/myrepo.git
_

その後、他のgitリポジトリと同様に操作できます。

34
Marmoy

異なるアクセス権を持つ複数のプロジェクト

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>

それが私の設定です。

1
tfa