【Linux】 CentOSにGitolite を導入する

Gitoliteはアクセス制御やユーザー管理の仕組みを提供してくれます。
今回はCentOSにGitoliteを導入してみたいと思います。
他のディストリビューションでもだいたい同じようにできると思います。

前提条件

  • SSHの設定が終わっていること

参考:CentOS でWebサーバー構築

Gitoliteをインストールする

Gitolite用のユーザーを作成する

$ sudo useradd git
$ sudo passwd git

追加したユーザーでSSH接続できるようにする

# /etc/ssh/sshd_config

AllowUsers hoge git

SSHを再起動

$ sudo /etc/init.d/sshd restart

ローカルPCで公開鍵と秘密鍵を作成してサーバーに送る

  • ここではパスフレーズなしにする
[local]$ cd ~/.ssh
[local]$ ssh-keygen -t rsa -f git-admin
[local]$ scp -P [ポート番号] ~/.ssh/git-admin.pub [ユーザー名]@[ホスト名]:~/

サーバーで公開鍵を/home/git に移動して所有権をgitユーザーに変更する

$ sudo mv ~/git-admin.pub /home/git/git-admin.pub
$ sudo chown git:git /home/git/git-admin.pub

ここからはgitユーザーで作業する

$ sudo su - git

インストールする。

[git]$ mkdir ~/tmp;cd ~/tmp
[git]$ git clone git://github.com/sitaramc/gitolite
[git]$ mkdir -p ~/bin
[git]$ gitolite/install -to ~/bin
[git]$ ~/bin/gitolite setup -pk ~/git-admin.pub

こんなエラーが出る場合

Can't locate Time/HiRes.pm in @INC (@INC contains: /home/git/tmp/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/git/tmp/gitolite/src/lib/Gitolite/Common.pm line 76.
BEGIN failed--compilation aborted at /home/git/tmp/gitolite/src/lib/Gitolite/Common.pm line 76.
Compilation failed in require at gitolite/install line 15.
BEGIN failed--compilation aborted at gitolite/install line 15.
$ sudo yum install perl-Time-HiRes -y

不要なファイルを削除する

[git]$ rm -rf ~/tmp
[git]$ rm -rf ~/git-admin.pub

authorized_keysを確認する

# ~/.ssh/authorized_keys

# gitolite start
....
# gitolite end

「# gitolite start」の前に何も書かれていないことを確認する。
記載があるとログインに失敗するみたい。
gitユーザーでsshログインなどしていた場合は入っている。

ローカルからGitoliteへの接続

# ~/.ssh/config

Host git-admin.example.com
     HostName [ホスト名]
     User git
     Port [ポート番号]
     IdentityFile ~/.ssh/git-admin

Gitoliteをローカルにクローンする

[local]$ cd
[local]$ git clone git-admin.example.com:gitolite-admin

Gitoliteにユーザーを追加する

  • コピー元の鍵は適宜変更してください。ここでは自分自身を追加するようにしています。
[local]$ cd ~/gitolite-admin
[local]$ cp ~/.ssh/id_rsa.pub ./keydir/[追加するユーザー名].pub
# ~/gitolite-admin/conf/gitolite.conf

repo gitolite-admin
    RW+     =   git-admin
    RW+     =   [追加するユーザー名]
[local]$ git add .
[local]$ git commit -m "add user: [追加するユーザー名]"
[local]$ git push origin master

GItへの接続情報を設定する

# ~/.ssh/config

Host git.example.com
     HostName [ホスト名]
     User git
     Port [ポート番号]
     IdentityFile ~/.ssh/id_rsa # 省略可能

testingリポジトリをクローンしてみる

$ git clone git.example.com:testing

プロジェクトをGitで管理する

プロジェクトを追加する

# ~/gitolite-admin/conf/gitolite.conf

repo     my-project
     RW+     =     git-admin

変更したファイルをサーバーへ送る

[local]$ git commit -am "add repo: my-project"
[local]$ git push origin master

プロジェクトを初期化してリモートリポジトリに追加する

[local]$ cd existing-project
[local]$ git init
[local]$ git remote add origin git.example.com:existing-project
[local]$ git add .
[local]$ git commit -m "first commit"
[local]$ git push origin master