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