1

サーバーで gitweb と gitolite を実行しています: http://git.jshawl.com/

git-http-backend匿名の複製を許可するように を設定するのに問題があります。

私の vhosts ファイル ( /etc/apache2/extra/httpd-vhosts.conf) は次のようになります。

<VirtualHost *:80>
DocumentRoot "/Users/git/repositories"
ServerName git.jshawl.com
 <Directory "/Users/git/repositories">
    Options ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
    AllowOverride All
    order allow,deny
    Allow from all
    AddHandler cgi-script cgi
    DirectoryIndex gitweb.cgi
</Directory>

<LocationMatch "^/.*/git-receive-pack$">
    AuthType Basic
    AuthName "Git Access"
    Require group committers
</LocationMatch

SetEnv GIT_PROJECT_ROOT /Users/git/repositories
SetEnv GIT_HTTP_EXPORT_ALL
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/libexec/git-core/git-http-backend/$1

ScriptAlias / /Users/git/repositories/gitweb.cgi/

`

http://www.kernel.org/pub/software/scm/git/docs/git-http-backend.htmlの指示に従いましたが、一貫してその 502 エラーに直面しています。

私のApacheエラーログには次のように書かれています:[Fri Aug 24 19:29:32 2012] [error] [client 198.228.200.148] client denied by server configuration: /usr/libexec/git-core/git-http-backend

また、これをすべて追加すると、私のgitwebインストールが停止しました(以前はhttp://git.jshawl.comにありました)

私は何を間違っていますか?

4

1 に答える 1

1

これは、クローン作成/プッシュ/プルに適した別のアプローチhttpd.confですが、gitweb.cgiを呼び出しません

GitWebはブラウジング用であり、クローン用ではありません

(小さな抜粋、認証の詳細、SSLの詳細の削除)

# GitHttp on @PORT_HTTP_HGIT@
Listen @PORT_HTTP_HGIT@
<VirtualHost @FQN@:@PORT_HTTP_HGIT@>
  ServerName @FQN@
  ServerAlias @HOSTNAME@
  SetEnv GIT_PROJECT_ROOT @H@/repositories
  SetEnv GIT_HTTP_EXPORT_ALL
  SetEnv GITOLITE_HTTP_HOME @H@
  ScriptAlias /hgit/ @H@/gitolite/bin/gitolite-shell/
  SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
  <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
  </FilesMatch>
  <Location /hgit>
    AddHandler cgi-script cgi
  </Location>
</VirtualHost>

言い換えると:

  • git-http-backendは変数によって参照され ますGIT_HTTP_BACKEND、GitoliteV3を使用している場合は必要ありません
  • gitolite-shellクローンアドレスで使用しているときに呼び出され/hgit/ます:theat GitoliteV3スクリプトは、リポジトリをクローンする権利があるかどうかを確認し、ある場合は、スクリプトの背後にあるコマンドを呼び出しますgit-http-backend:' git-receive-pack'(プッシュの場合)または' git-upload-pack'(クローンの場合) / pull / fetch)、gitソース自体から直接http-backend.c

それで:

git clone https://yourServer/hgit/yourRepo

git-receive-pack' 'または' 'を呼び出すgitoliteを呼び出しますgit-upload-pack
最初に呼び出してhttpリクエストを分析しますsub http_simulate_ssh_connection()

sub http_simulate_ssh_connection {
    # these patterns indicate normal git usage; see "services[]" in
    # http-backend.c for how I got that. Also note that "info" is overloaded;
    # git uses "info/refs...", while gitolite uses "info" or "info?...". So
    # there's a "/" after info in the list below
    if ( $ENV{PATH_INFO} =~ m(^/(.*)/(HEAD$|info/refs$|objects/|git-(?:upload|receive)-pack$)) ) {
        my $repo = $1;
        my $verb = ( $ENV{REQUEST_URI} =~ /git-receive-pack/ ) ? 'git-receive-pack' : 'git-upload-pack';
        $ENV{SSH_ORIGINAL_COMMAND} = "$verb '$repo'";
    } else {
        # this is one of our custom commands; could be anything really,
        # because of the adc feature
        my ($verb) = ( $ENV{PATH_INFO} =~ m(^/(\S+)) );
        my $args = $ENV{QUERY_STRING};
        $args =~ s/\+/ /g;
        $args =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
        $ENV{SSH_ORIGINAL_COMMAND} = $verb;
        $ENV{SSH_ORIGINAL_COMMAND} .= " $args" if $args;
        http_print_headers(); # in preparation for the eventual output!
    }
    $ENV{SSH_CONNECTION} = "$ENV{REMOTE_ADDR} $ENV{REMOTE_PORT} $ENV{SERVER_ADDR} $ENV{SERVER_PORT}";
}
于 2012-08-25T00:11:02.667 に答える