massの日記

日々の薪

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