gitolite v3.2.0 を入れてみた

今までずっと、次に git 環境を構築するときは gitolite を入れようと思いながら、
かなり時間が経ってしまいました。
やっと入れる機会がきたので、早速導入してみました。

gitosis と gitolite

gitosis は、開発が長い間止まってしまっているらしい。
それに、細かいアクセス制御ができない。(ブランチ別、とか、タグ別、とか。)
なので、今回は gitolite を入れました。
(自宅や研究室では、今も gitosis なので、早めに乗り換えちゃった方がよさそうだなぁ。)

インストール

バージョンが新しくなってから、インストール方法がちょっと変わっている模様。
素直に README を読んでインストールしました。

アカウントの準備

アカウント名は、ここでは gitolite にしていますが、
別に git でも何でも分かりやすい名前でいいです。
初期ユーザ用に、公開鍵を登録します。
ここでは、鍵作成から行っていますが、
既に自分の鍵がある人は、それを使えばよいです。

$ sudo useradd gitolite
$ sudo su gitolite
(gitolite)$ cd ~
(gitolite)$ mkdir .ssh -m 0700
(gitolite)$ exit
$ mkdir ~/.ssh -m 0700
$ ssh-keygen -t rsa
(パスワードの設定はなし)
$ sudo cp ~/.ssh/id_rsa.pub /home/gitolite/なまえ.pub
$ sudo su gitolite
(gitolite)$ $HOME/bin/gitolite setup -pk なまえ.pub
(gitolite)$ exit
$ sudo rm -f /home/gitolite/なまえ.pub
gitolite のインストール

git で最新版をとってきます。
その後の内容は、README に載ってるとおりです。
gitolite の .ssh ディレクトリ内に authorized_keys がある場合は、先に削除しておきます。

(gitolite)$ rm -f ~/.ssh/authorized_keys # もしファイルがあるなら削除しておく
(gitolite)$ cd /tmp
(gitolite)$ git clone git://github.com/sitaramc/gitolite 
(gitolite)$ mkdir -p $HOME/bin   
(gitolite)$ gitolite/install -to $HOME/bin
(gitolite)$ cd /tmp
(gitolite)$ rm -rf gitolite
(gitolite)$ cd ~/
(gitolite)$ $HOOME/bin/gitolite setup -pk なまえ.pub   # 初期ユーザを指定して設定実施

これでインストールは終わりです。ほんとサックリ入っちゃうなぁ。

リポジトリの追加とかユーザの追加とか

初期ユーザで、gitolite-admin リポジトリを clone してやります。

$ git clone gitolite@localhost:gitolite-admin

ここでパスワードの入力を求められたら、インストール作業をどこかミスってます。
うまくいけば、こんな表示が出るはず。

Cloning into 'gitolite-admin'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
ユーザの追加

追加したいユーザの公開鍵を、keydir 内に入れます。
鍵に使える文字は、英数字とピリオド、アンダースコア、ダッシュ(ハイフン)だけです。
ただし、"hoge@your.domain" みたいな形ならアットマークをつけることができます。
でも、"hoge@domain" みたいに、@以降にピリオドがないものはダメらしい。
名前の最後に、拡張子 ".pub" をつけることを忘れないように。


追加し終わったら、コミットして push しておく。

git add keydir
git commit -m 'added users hoge and mofu'
git push
リポジトリの追加・編集

conf/gitolite.conf を編集する。
デフォルトで、以下の内容が書かれている。

repo gitolite-admin
    RW+     =   なまえ
                
repo testing    
    RW+     =   @all

testing はいらないので、消してしまってOK。
testing を消した場合は、後で /home/gitolite/repositories/repotest.git を消しておく。(warning対策)
gitolite-admin は、gitolite の管理者だけ登録しておこう。
後は、追加したいリポジトリを書く。

repo gitolite-admin
    RW+     =   なまえ

repo hoge

repo bar

repo mofu
リポジトリのアクセス権限設定

さて、ここから話が少しややこしくなる。
gitosis と違って、gitolite は詳細なアクセス権限を各ユーザに設定することができる。
公式の README に載っているサンプルは、以下のようになっている。

        repo foo
            RW+                     =   alice
            -   master              =   bob
            -   refs/tags/v[0-9]    =   bob
            RW                      =   bob
            RW  refs/tags/v[0-9]    =   carol
            R                       =   dave

RW は、fast-forward な push やコミットの作成を意味する。
RW+ は、fast-forward に限らず、すべての push を意味する。
ダッシュ '-' は、指定されたブランチやタグへの push を拒否する。
1つ1つ見ていこう。


alice はいかなる操作も許可されている。(RW+ = alice)
bob は、master への push は許可されていない。(- master = bob)
さらに bob は、"v+数字" で始まるタグを作成することができない。(- refs/tags/v[0-9] = bob)
でも bob は、上記以外のブランチ等に対しては、fast-forward な push やコミットの作成を許可されている。(RW = bob)
carol は、"v+数字" で始まるタグを作成することだけができる。( RW refs/tags/v[0-9] = carol)
dave は、clone と fetch だけできる。(R = dave)


どの条件にもマッチしない場合は、拒否される。
これらの条件をうまく使って、conf/gitolite.conf を作成しよう。
作成し終わったら、コミットして push するのを忘れないように。

git add conf
git commit -m 'added project hoge, bar and foo gave access to alice, bob, carol'
git push

この時点で、gitolite が自動的に空のリポジトリを作成してくれる。
後は、プロジェクトメンバーが追加されたリポジトリを自由に clone して歴史を紡げばいい。

グループ

gitolite.conf にグループ設定を記述することもできる。
例えば、hoge, bar, foo を開発者、john をインターン生として設定するなら、

@developers = hoge bar foo
@interns = john

repo mofu
  RW+ = @developers
  RW = @interns

こんな具合に書ける。便利だね!

その他

ssh からコマンドを叩くことで、設定情報を見たりできる。
以下の例では、自分がどのリポジトリに対してどういう権限を持っているかを見ている。

$ ssh gitolite@localhost info
hello なまえ, this is gitolite@さーば running gitolite3 v3.2-0-g5f9789e on git 1.8.0

 R W    gitolite-admin
 R W    hoge

info の部分を help に変えると、いろんなコマンドが表示される。

$ ssh gitolite@localhost help
hello なまえ, this is gitolite3 v3.2-0-g5f9789e on git 1.8.0

list of remote commands available:

        desc
        help
        info
        perms
        writable

設定がうまくいかないときは、これで確認してみるのもよさそう。