普段はssh経由でgitを使っているのだけれどhudsonでgit cloneするときにちょっと困ったので、認証の要らないGitプロトコルを使ってみることにしたよ。
hudsonでリモートのgitリポジトリからソース取って来ようとしたのだけれど、ssh経由なのでビルド自動実行時にパスワードプロンプトが出ちゃってうまくいかない。
そこで認証のいらないGitプロトコル(git://)でアクセスできるようにしてみたよ。
最初にgitosisというのを試そうと思ったのだけど、プロジェクトを管理する方法煩雑になりそうだったので、git-daemonだけでなんとかすることにした。ちなみにdebian。
目標
- リポジトリの取得(git clone)はssh経由でなくてもできるように、git-daemonを動かしてgitプロトコルでアクセスできるようにする。
- 日々の開発でpushする場合はssh経由で行う。
gitリポジトリの作成
gitサーバーで作業。
リポジトリサーバー名:sever
公開リポジトリの場所:/home/repos/
とするよ。ユーザー別に管理したかったので公開リポジトリの下に各ユーザーのディレクトリを作ったよ。僕用のディレクトリはskmkという名前。
$ cd /home/repos/skmk
まずここに管理用のbareリポジトリを作るよ。
$ mkdir hoge.git $ cd hoge.git $ git init --bare --shared=true Initialized empty shared Git repository in /home/repos/skmk/hoge.git/ $ echo "Project hoge" > description $ touch git-daemon-export-ok
descriptionを書き換えたのは、これをやらないとgit pushするときに
*** Project description file hasn’t been set
と怒られてpushできなかったからだよ。
git-daemon-export-okという空のファイルをtouchコマンドで作ったね。これをhoge.gitの直下に置くことで、このリポジトリは公開用という印になるんだよ。
gitリポジトリへpush
開発マシンでの作業
ローカルの開発マシンからpush。今回は新規に作ったものをサーバーへpushするよ。日々の開発用なのでssh経由で。
$ mkdir hoge_devel $ cd hoge_devel $ git init $ touch hoge.txt $ git add . $ git commit -a -m"initial import" $ git add remote origin ssh://server/home/repos/skmk/hoge.git $ git push origin master skmk@server's password: Counting objects: 3, done. Writing objects: 100% (3/3), 206 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh://server/home/repos/skmk/hoge.git * [new branch] ? ? ?master -> master
git-daemonを動かす
gitサーバーで作業。
あとはgit-daemonを動かす。まずは以下のコマンドで試してみるよ。
$ sudo -u gitosis git-daemon --base-path=/home/repos/ --reuseaddr --verbose /home/repos/git
オプションについて簡単な説明。
- あらかじめ作ったgitユーザーでdaemonを実行する。僕の場合面倒だったので、aptitude install gitosisすると自動で作られるgitosisユーザーを流用して動かしたの。だから -u gitosisとなってるのでした。
- –base-pathは公開リポジトリのベースとなる場所を指定
- –reuseaddrをつけておくと古いコネクションのタイムアウトを待たないので、設定調整しながら動かしたり止めたりするときに便利だよ。
- –export-allをつけるとgit-daemon-export-okの有無に関わらず全部公開されるよ。
- –enable-server=receive-packをつけるとgitプロトコルでpushできるようになる。ただし誰でも認証なしで好き勝手にpushできちゃうので注意
gitプロトコルを使ってgit-cloneしてみる
開発マシンなど任意のサーバで作業。
git-daemon動かした状態で、ローカルマシンとかでgitプロトコル使ってgit cloneしてみる。
$ git clone git://server/skmk/hoge.git
–base-pathを設定してgit-daemon起動したので、sshのようにフルパス書かなくても、サーバーの後ろに/home/repos以下のディレクトリから書けば大丈夫だよ。
git-daemon-export-okを作るのを忘れていると
Initialized empty Git repository in /home/skmk/test/hoge/.git/ fatal: The remote end hung up unexpectedly
となってcloneできないよ。
xinetdでgit-daemonを動かす
gitサーバーで作業。
うまく動いたらスーパーサーバーデーモンにgit-daemonを登録するよ。さっき動かしたgit-daemonは止めてね。
xinetdの例で説明。xinetdがない場合はaptitude install xinetdでインストールしてね。
他のファイルに倣って、/etc/xinetd.d/gitというファイルを作成。
# description: git daemon # This is the tcp version. service git { disable = no socket_type = stream protocol = tcp user = gitosis wait = no server = /usr/bin/git-daemon server_args = --base-path=/home/repos/git --inetd --verbose log_on_failure += USERID }
port = 9418は/etc/servicesに入ってたから、なんとなく略してみた。
それでは、xinetdを再起動してみます。
# cd /etc/init.d # ./xinetd restart Stopping internet superserver: xinetd. Starting internet superserver: xinetd.
これで、他のサーバーからgitプロトコルでgit-cloneできるはず。お疲れ様でした。