先日、RedmineとGitを連携させる(認証統合) - torutkの日記 でGitリポジトリをHTTP経由でアクセスする設定を書きました。その設定で、新たにGitリポジトリを構築したサーバーにアクセスすると、次のようにエラーとなります。
OSのバージョンとgitのバージョン
$ cat /etc/redhat-release CentOS release 6.3 (Final) $ git --version git version 1.7.1
HTTP経由でリポジトリのクローンを試みる
$ git clone http://gito.example.org/git/basicauthen.git Initialized empty Git repository in /home/hogehoge/work/basicauthen/.git/ error: The requested URL returned error: 401 while accessing http://gito.example.org/git/basicauthen.git/info/refs fatal: HTTP request failed $
このときのHTTPサーバー側のログ(access_log)
192.168.1.10 - - [27/Jan/2013:16:15:07 +0900] "GET /git/basicauthen.git/info/refs?service=git-upload-pack HTTP/1.1" 401 475 "-" "git/1.7.1" 192.168.1.10 - - [27/Jan/2013:16:15:07 +0900] "GET /git/basicauthen.git/info/refs HTTP/1.1" 401 475 "-" "git/1.7.1"
git cloneコマンド実行時、Basic認証ではユーザー/パスワード入力を促すと思っていましたが、上述のとおり入力を求めることなく401エラーとしてしまいます。
ずっとHTTPサーバー側の設定が原因と思って調べまわってましたが、たまたまWindowsのCygwin上で同じリポジトリに対してクローンしてみたところ、
$ git clone http://gito.example.org/git/basicauthen.git Cloning into 'basicauthen'... Username for 'http://gito.example.org': hogehoge Password for 'http://hogehoge@gito.example.org': fugafuga remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done.
と、すんなりアクセスできるではないですか・・・。
次は、Fedora 17を立ち上げて、アクセスを試みてみました。
$ git --version git version 1.7.11.7 $ git clone http://gito.example.org/git/basicauthen.git Cloning into 'basicauthen'... Username for 'http://gito.example.org': hogehoge Password for 'http://hogehoge@gito.example.org': fugafuga remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done.
と、こちらもすんなりアクセスできました。
うーん、3日間、Apacheの設定、GitのCGI設定を調べ回り、KVM仮想化ゲストをいくつか立てて試したりとしていましたが、落ちがCentOS 6のgitコマンドがhttpでBasic認証を要求されてもコマンドプロンプトでユーザーに入力を促すことなくサーバーへリクエストを送って401エラーを喰らって終了という、なんともな結果でした。
CentOS 6のgit 1.7.1での回避策
リポジトリURLにユーザー名を追加
$ git clone http://hogehoge@gito.example.org/git/basicauthen.git Initialized empty Git repository in /home/hogehoge/work/git_http/basicauthen/.git/ Password: fugafuga remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done.
URLにユーザー名を入れると、パスワード入力が促されるので、認証アクセスが可能になります。
リポジトリURLにユーザー名とパスワードを追加
$ git clone http://hogehoge:fugafuga@gito.example.org/git/basic authen.git Initialized empty Git repository in /home/hogehoge/work/git_http/basicauthen/.git/ remote: Counting objects: 6, done. remote: Compressing objects: 100% (3/3), done. remote: Total 6 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (6/6), done.
URLにユーザー名とパスワードを入れると、認証アクセスが可能になります。
~/.netrcに接続先ホスト、ユーザー名、パスワードを記載
~/.netrcに以下のようにホスト名、ユーザー名、パスワードを記載します。
machine gito.example.org
login hogehoge
password fugafuga
すると、リポジトリURLに前にエラーになっていた記載の方法でアクセスするとエラーにならずコマンドが実行可能になります。
$ git clone http://gito.example.org/git/basicauthen.git Initialized empty Git repository in /home/hogehoge/work/git_http/basicauthen/.git/ remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done.