web-dev-qa-db-ja.com

git-http-backend.exeを使用してWindowsでGitサーバーをセットアップする

私は、Apacheとgit-http-backend.exeを使用してWS 2008マシンにGitサーバー(1.7.2.3)をセットアップしているところです。私は良いツイッターをフォローしています ここ 。 GUIが機能しているので、わずらわしくクローンを作成できます。リポジトリの構成に次のものを入れると、わずらわしくプッシュできます。

[http]
 receivepack = true

Httpd.confファイルに以下を追加しました。

SetEnv GIT_PROJECT_ROOT C:/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))$" \
                    "C:/Program Files (x86)/git/libexec/git-core/git-http-backend.exe/$1"

<Directory />
  Allow from all
</Directory>

<LocationMatch "^/git/.*/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
  AuthUserFile C:/GIT/ApacheConfig/users
  AuthGroupFile  C:/GIT/ApacheConfig/groups
        Require group repogeneral        
</LocationMatch>

「LocationMatch」を追加しても、迷惑なクローンを作成したり、URLに名前を指定したりすることができます。gitclone http://[email protected]

パスワードとクローンの入力を求められます。

しかし、リポジトリにプッシュバックしようとすると、次のようになります。

エラー:URLにアクセスできません http://[email protected]/newtestrepo.git/ 、リターンコード22致命的:git-http-プッシュに失敗しました

私は例として http-backend.exeのmanページ を見てきましたが、それらを機能させることができません。

これが私のグループファイルです(これは例をテストしているだけなので、prodでは使用されません):

admin: jon steve admin
webview: jon steve web
repogeneral: jon steve
testrepo: jon admin
testrepo2: jon steve web

これがユーザーファイルです:

jon:$apr1$kEKVExYx$guIF9oYV8buGhFLZr16XN0
steve:$apr1$jvgjF9nv$PvWsHH.cSOBN5ymk6NT1B0
admin:$apr1$vzXgDskN$oszCei3tkHNUgtLj2HkHF/
web:$apr1$wS0do7hb$VA9tsc9c9LwY5PcjfhdwK0

ユーザー名jonは、GUIセクションにディレクトリ要件を設定したかのように機能することを知っています。ユーザー名jonで問題なくログインできます(locationmatchと同じユーザーファイルとグループファイルを指します)。

この時点でどの構成を見逃したのかわかりません(構成の問題を想定しています)。

この最後のハードルを乗り越えるためのアドバイスは素晴らしいでしょう。

[〜#〜]編集[〜#〜]

私はもう少し遊んでいます、そしてここに私が持っている情報があります:

リポジトリのクローンを作成する場合:

git clone http://[email protected]/remotetest.git

リポジトリを取り出すことはできますが、次のようにプッシュバックしようとすると、

git PushOriginマスター

パスワードの入力を求められ、入力すると、もう一度パスワードが要求され、次のエラーが発生します。

C:\ temp\remotetest\remotetest> gitプッシュオリジンマスターパスワード:パスワード:エラー:URLにアクセスできません http://[email protected]/remotetest.git/ 、リターンコード22致命的:git -http-プッシュに失敗しました

私のApacheaccess.logには、次のものがあります。

192.168.1.2 - - [29/Sep/2010:21:58:19 +0100] "GET /remotetest.git/info/refs?service=git-upload-pack HTTP/1.1" 200 38
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/info/refs?service=git-receive-pack HTTP/1.1" 403 -
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/info/refs HTTP/1.1" 200 -
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/HEAD HTTP/1.1" 200 23

興味深いことに、URLにユーザー名を使用してクローンを作成する場合、入力したパスワードは関係ありませんが、引き続き機能します。これは匿名でプルできるはずだからだと思います。その時点でなぜパスワードを要求するのかわからない。

ログエラーにもこれが表示されます。

[Wed Sep 29 22:33:00 2010] [error] [client 192.168.1.2] client denied by server configuration: C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe
[Wed Sep 29 22:33:00 2010] [error] [client 192.168.1.2] client denied by server configuration: C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe

編集2

次の手順でパスワードファイルを再作成してみました。

htpasswd -c -m C:/git/apacheconfig/users jon

しかし、これは役に立ちませんでした。

編集3

PHP httpd.confのconfigで、基本認証に同じユーザーファイルを使用します。

<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs">
    AuthName "GitUsers"
    AuthType Basic
    AuthUserFile C:/GIT/ApacheConfig/users
AuthGroupFile  C:/GIT/ApacheConfig/groups

    require group webview
</Directory>

編集4

OK、クローン作成と迷惑モードでのプッシュを問題なく行うことができますが、プッシュの認証は失敗します。

C:\temp\test2\temp\test>git Push Origin master
Password:
Password:
error: Cannot access URL http://[email protected]:8000/repositories/test.git/, return code 22
fatal: git-http-Push failed

以下を使用するようにhttpd.confを変更しました。

<VirtualHost *:80>
    SetEnv GIT_PROJECT_ROOT "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories"
    SetEnv GIT_HTTP_EXPORT_ALL

    <Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories">
       Options Indexes FollowSymLinks MultiViews Includes ExecCGI
       AllowOverride None
       Order allow,deny
       Allow from all
    </Directory>

    <LocationMatch "^/repositories/.*/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories/.htpasswd"
        Require valid-user
    </LocationMatch>
    ScriptAliasMatch \
            "(?x)^/repositories/(.*/(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))$" \
            "C:/Program Files (x86)/Git/libexec/git-core/git-http-backend/$1"

    ErrorLog C:/GIT/error_log
    CustomLog C:/GIT/access_log combined
</VirtualHost>

興味深いことに、新しいリポジトリ(git init --bare newrepo.git)を作成したとき、info/refsファイルは作成されませんでした。それを作成するには、「gitupdate-server-info」コマンドを実行する必要がありました。

Apache Accessログには、手がかりとなる可能性のある興味深いものがあります。

192.168.10.97 - - [05/Oct/2010:22:48:26 +0100] "GET /repositories/test.git/info/refs?service=git-receive-pack HTTP/1.1" 200 -
192.168.10.97 - - [05/Oct/2010:22:48:26 +0100] "GET /repositories/test.git/HEAD HTTP/1.1" 200 23
192.168.10.97 - - [05/Oct/2010:22:48:28 +0100] "PROPFIND /repositories/test.git/ HTTP/1.1" 405 248

それは私がリポジトリに「プッシュ」しようとしたときですが、それらはGETコマンドであり、POSTではありません。 PROPFINDが何であるかわからない、それについての多くの情報はまだ見つかりません。 (読んで)、ある種の書き直しが行われている可能性があると思います。つまり、POSTをGETに変更して、それを強制終了するか、何かです。私はこれに深みがありません。しかし、ポイント。

ありがとう

22
Jon

OK、地獄が凍りついて、ついにこれが機能するようになりました!

私のセットアップで根本的に間違っていたことが2つあったと思います。

1)ユーザーが認証を通過していませんでした。これが役に立ったことがわかりました。

SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

次に、物理的な「ディレクトリ」を機能させることができませんでした。

<Directory "C:/GIT/Apache/repositories">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</Directory>

これを解決するために、プルとプッシュの両方にlocationMatchを使用しました。これは、プルおよびプッシュするには認証が必要であることを意味します。煩わしいプルが必要な場合は、「git-upload-pack」セクションを削除できます。

これが他の誰かを助けるかもしれないことを願っています。

これが私の最終的なhttpd.confファイルです:

DocumentRoot "C:/GIT/Apache/www"

<Directory />
Options +ExecCGI
Allow from all  
</Directory>

<Directory "C:/GIT/Apache/www">
  Allow from all
</Directory>

<Directory "C:/GIT/Apache/www/secure">
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
require valid-user
</Directory>

SetEnv GIT_PROJECT_ROOT C:/GIT/Apache/repositories
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))$" \
                    "C:/Program Files/git/libexec/git-core/git-http-backend.exe/$1"


<LocationMatch "^/.*/git-receive-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</LocationMatch>

<LocationMatch "^/.*/git-upload-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</LocationMatch>
25
Jon