GitでのHTTP通信覚え書き書き込み編
HTTP経由でのGitの通信を設定する上で色々とはまったので、覚え書き。
今回は書き取り編。読み取りに関してはほとんどはまりがなかったけれど、備忘録的につけておく。
目標
HTTP経由で、既存のGitプロジェクトのリポジトリをcloneし 変更を加えpushできるようにする。cloneまでは前回の読み取り編でできているので、今回は書き込みの設定。
例)HTTPサーバ=Apache、起動ユーザ=daemonの場合、リポジトリのパスは適時自分のものを設定
- サーバ側の設定
HTTP経由の書き込みではWebDavを使う。まず初めにこちらの設定を行う。
#dav_module,dav_fs_moduleがロードされていることを確認 $ /usr/local/apache2/bin/httpd -M
davモジュールがロードされていることを確認したら、次はhttp.confにWebDavの設定を追記。
DAV on AuthType Basic AuthName "Git" AuthUserFile /your/passwdfile.git #適時自分のパスワードファイルを Require valid-user
passwdファイルの作成
$ htpasswd -c /your/passwdfile.git
Apacheの再起動
- クライアント側の設定
.netrcファイルの作成
$ cd $ emacs .netrc #machine#login #password
gitプロジェクトのclone
$ mkdir git $ cd git $ git clone http://gitserver/project.git $ cd project
gitプロジェクトへのpush
$ touch test.txt $ git add . $ git commit -m 'http-push test' $ git log $ git push origin master
ここで1つ目のはまり。
$ fatal: git-push is not available for http/https repository when not compiled with USE_CURL_MULTI.
今回クライアント側ではyumでインストールしたgitを使っていた。特にoption指定していなかったので、HTTPサポートのために使われているcurlはもともと入っていたcurlになっている。どうやらこのcurlのバージョンが古いため、git http-pushが使えないようだ。
自分で最新版のcurlをいれて、そちらをコンパイルしてみることにする。
$ yum remove git $ cd $ mkdir download $ cd download $ wget http://curl.haxx.se/download/curl-7.21.7.tar.gz $ tar zxf curl-7.21.7.tar.gz $ cd curl-7.21.7 $ ./configure $ make $ make install $ cd ../../download $ wget http://kernel.org/pub/software/scm/git/git-1.7.6.tar.bz2 $ tar jxf git-1.7.6.tar.bz2 $ cd git-1.7.6 $ ./configure --with-curl=/usr/local $ make $ make install
しかし、この後にgitでpushしようとしても、何故かgit http-pushのコマンドはありませんと怒られた。どうやらビルドコンパイルがうまくいっていない模様。ここが2つ目のはまり。
$ cd $ cd git/project $ git push origin master $ git: 'http-push' is not a git command.
もう一度gitの方をmake clean、make、make installの順番でやりなおすと、たしかにcurlの部分でno-filesといわれている。気付かなかった。しかし、--with-curlはつけているし、ソースファイルも入っている。ヘッダファイル関係なのかと思い、yumでcurl-develをインストール。
yum install curl-devel
yumでgitインストールしたタイミングでは、git http-pushそのものはコマンドとして認識されていた。つまりこの時点ではcurlの認識はうまくされていたということだと思う。
その後自分でいれたcurlがうまく認識されていない理由がいまいちわからなかった。--with-curlのオプションはつけているし、git http-pushが認識されていないという状態がcurl-develがないが故のものだとすると、最初からコマンドとしてないですよーというエラーが出そうなもの。
なにはともあれ、gitでhttp-pushのコマンドが認識されるようになった。後はgit pushすればOK。
$ cd $ cd git/project $ git push origin master