Gitプロトコルでリモートリポジトリにアクセス

普段は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できるはず。お疲れ様でした。

1 Trackback / Pingback

  1. git-daemonの設定方法 | 三流技術者の備忘録

Leave a Reply

Your email address will not be published.