Gitサーバ gitolite をFreeBSDで使ってみる

gitoliteとは複数のgitリポジトリをプライベートな環境でも簡単に管理できるツールです。 このgitoliteの特徴はssh接続経由でアクセスして利用するためgitoliteはデーモン等のように起動させておくサーバのようなものはありません。 今回は自分で管理しているFreeBSD上にgitoliteをインストールして設定してみます。 FreeBSDには2種類のgitoliteとgitolite2のportsが存在します。 今回インストールするのはgitolite2を利用します。 利用する環境はサーバ側にFreeBSD、クライアント側にMacosx

gitolite install

portsから簡単にインストールできます。

サーバ側)

# portinstall gitolite2

インストールに成功すると自動的にgitユーザアカウントが作成されそのhomeディレクトリが/usr/local/git に設定されこの配下にpushしたリポジトリが作成されます。

gitoliteアクセス用の公開鍵・秘密鍵を作成

ローカルのクライアント側で2つの鍵を作成します。秘密鍵はローカルで公開鍵はgitoliteのあるサーバ側で利用します。

  • 秘密鍵:gitolite
  • 公開鍵:gitolite.pub

鍵作成

クライアント側)

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yourname/.ssh/id_rsa): /Users/yourname/.ssh/gitolite
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/yourname/.ssh/gitolite
Your public key has been saved in /Users/yourname/.ssh/gitolite.pub

sshクライアントの接続設定

ssh接続設定をします。以下のファイル(config)を作成します。

この例ではサーバのIPアドレスは192.168.0.10 identityfile には先程作成した秘密鍵の方を指定します。

クライアント側)

~/.ssh/config
host gitserver
    user git
    hostname 192.168.0.10
    port 22
    identityfile ~/.ssh/gitolite

公開鍵(gitolite.pub)をサーバ側に転送します

$ scp .ssh/gitolite.pub user_account@192.168.0.10:~/

先ほど転送した公開鍵をgitユーザのhomeディレクトリにコピーする。

サーバ側)

$ su -
password:
# su - git
$ cp ~/user_account/gitolite.pub /usr/local/git/gitolite.pub
$ sudo chown git:git gitolite.pub

gitoliteセットアップ

ここでは必ずgitユーザで操作して下さい。homeにコピーした公開鍵を指定してgl-setupを実行する。

サーバ側)

$ gl-setup gitolite.pub
creating gitolite-admin...
Initialized empty Git repository in /usr/local/git/repositories/gitolite-admin.git/
creating testing...
Initialized empty Git repository in /usr/local/git/repositories/testing.git/
[master (root-commit) 301f579] gl-setup gitolite.pub
 2 files changed, 8 insertions(+), 0 deletions(-)
 create mode 100644 conf/gitolite.conf
 create mode 100644 keydir/gitolite.pub

gitolite管理用レポジトリをローカルに取得します。

クライアント側)

$ git clone ssh://gitserver/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.

ユーザ及びリポジトリを管理する

gitoliteの設定を変更するには管理リポジトリgitolite-adminを取得しエディタ等 で編集あるいはファイルを追加しサーバにpushします。

以下が先ほどローカルにgitolite-adminのリポジトリをcloneした内容です。

gitolite-admin
├── conf
│   └── gitolite.conf
└── keydir
    └── gitolite.pub

リポジトリの設定は conf/gitolite.conf リポジトリを操作できるユーザを追加するにはkeydir に各ユーザが作成した公開鍵をディレクトリーへ入れます。

例)レポジトリMyAppを作成します

クライアント側)conf/gitolite.conf

repo gitolite-admin
     +RW  =  gitolite

repo testing
     +RW  =  @all

repo MyApp
     +RW  =  @all

例)リポジトリを操作できるユーザを追加する

gitolite-admin/keydir 以下に追加するユーザが作成した公開鍵をコピーします。

設定変更を反映させるためにgitolite-adminのレポジトリをcommit&pushします。

クライアント側)

$ git add .
$ git commit -m 'new repo MyApp add'
$ git push
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 393 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: creating MyApp...
remote: Initialized empty Git repository in /usr/local/git/repositories/MyApp.git/
To ssh://gitserver/gitolite-admin

gitolite-adminのpushが完了すると変更内容が反映されてMyAppレポジトリがサーバ側に新規作成されます。

先ほど作ったMyAppレポジトリをローカルにcloneしてみます。

クライアント側)

$ git clone ssh://gitserver/MyApp
Cloning into 'MyApp'...
warning: You appear to have cloned an empty repository.

まだ何もない空のMyAppリポジトリがローカルにできました。

クライアント側)

$ cd MyApp
$ ll
total 0
drwxr-xr-x   3 tooru  staff  102 10  8 21:20 .
drwxr-xr-x   3 tooru  staff  102 10  8 21:21 ..
drwxr-xr-x  10 tooru  staff  340 10  8 21:20 .git

ここにファイル(readme)を追加してリモートのリポジトリにpushしてみます。

クライアント側)

$ touch readme
$ git add .
$ git commit -m 'readme file add'
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'ssh://gitserver/MyApp'

なんかエラーが出てるようです。master branch に push しろっていってるのかなぁ・・

以下のようにpushするとうまくいくようです。

クライアント側)

$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 219 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://gitserver/MyApp
 * [new branch]      master -> master
created:

Back to top