業務で使い始めた Git ですが、高機能過ぎて未だに使いこなせている自信がありません。
一方で、かつて利用していた Subversion はコマンドを忘れてしまって使うたびにググるほどに記憶が抜けつつあります。
そんな Git を複数メンバー・複数環境で利用する場合、マスターリポジトリを利用することがあります。これにより、Subversion のような中央集約型のソースコード管理をしつつも Git の恩恵を受ける開発スタイルを取ることができるます。
マスターリポジトリとして GitHub を利用するのが最も手っ取り早いですが、プライベート(= メンバーのみが閲覧できる)なリポジトリを作成するためには有料オプションにしなければなりません。しかも地味に高い。
こんな時、gitosis を利用すると手軽にプライベートな Git サーバを構築することができます。もちろん、リポジトリを利用するメンバー全員が SSH での接続ができるサーバに bare リポジトリを作ることでも Git サーバとして機能しますが、それでも gitosis を使う優位性は以下のような点にあります。
- 公開鍵認証を用い、通信にSSHを利用するため安全に利用できる
- 公開鍵でユーザを識別し、リポジトリに対するアクセス制御が設定できる
- サーバにアカウントとは切り離して、リポジトリへのアクセスアカウントの作成ができる
gitosis はマスターリポジトリとして利用するサーバのみインストールします。リモートから clone / pull / push をするクライアントには、通常通りの Git がインストールされていれば利用することができます。
gitosis は python で記述され、gitで管理されているプロジェクトです。
CentOS の場合、EPEL リポジトリに Git / gitosis 共にパッケージが存在するので、これを利用することで簡単にインストールできます。
$ sudo yum install git python-setuptools gitosis
この方法で導入した場合、gitosis ユーザが合わせて作成されます。
- uid: gitosis
- home dir: /var/lib/gitosis
gitosis の設定は、 gitosis 管理リポジトリのファイルを変更し push することで反映されます。
設定を行うためには、管理ユーザとして最低一人の公開鍵をセットしなければなりません。ここでは、Git サーバ上の現在の操作ユーザの鍵を管理ユーザとしてセットする例を示します。
$ cd /var/lib/gitosis
$ sudo -H -u gitosis gitosis-init < ~/.ssh/id_rsa.pub
これで、gitosis のホームに "gitosis" ,"repositories" という2つのディレクトリが生成されます。
$ sudo -H -u gitosis tree
.
|-- gitosis
| `-- projects.list
`-- repositories
`-- gitosis-admin.git
|-- HEAD
|-- branches
|-- config
|-- description
|-- gitosis-export
| `-- keydir
| `-- hatak@example.jp.pub
|-- gitosis.conf
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-commit.sample
| |-- post-receive.sample
| |-- post-update
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- pre-rebase.sample
| |-- prepare-commit-msg.sample
| `-- update.sample
|-- index
|-- info
| `-- exclude
|-- objects
| |-- info
| `-- pack
| |-- pack-e0194c80b63eb10d17a54a4a4551efc7fea1076d.idx
| `-- pack-e0194c80b63eb10d17a54a4a4551efc7fea1076d.pack
`-- refs
|-- heads
| `-- master
`-- tags
14 directories, 22 files
この gitosis 管理リポジトリを、登録した鍵を持つクライアント(ここでは同一ホスト)からcloneし、設定します。
$ cd ~/work
$ git clone gitosis@localhost:gitosis-admin.git
設定を変更後、push することで Hooks のスクリプトが実行されることで key が gitosis ユーザの authorized_keys に追記されていきます。
この authorized_keys には command が併記されているため、git のリモートリポジトリを操作する以外のコマンドが実行できないようになっているのです。
新規ユーザの追加は、*.pub ファイルを作成して該当するグループに追記、push するだけです。
gitosis では、グループ毎に権限をコントロールする形式を取ります。このため、ユーザが複数のグループに所属しているとうまく動作しないことがあります。
新規リポジトリの追加は、gitosis.conf に変更を加えて push するだけです。空のまま pull すると init されるだけですが、追加して push すれば大丈夫です。
keydir 以下に公開鍵ごとにファイルを作成し、 gitosis.conf に公開鍵のファイル名 (.pub を除く) を設定していきます。
[gitosis]
[group gitosis-admin]
writable = gitosis-admin \
members = admin
[group development]
writable = misc/sandbox \
project test
members = hatak \
hoge \
fuga
リポジトリはサブディレクトリに入れることができます。
上記 sandbox の場合は次のようになります。
- Clone 用 URL : ssh://gitosis@localhost/misc/sandbox.git
- サーバ内ファイルシステム: /var/lib/gitosis/repositories/misc/sandbox.git
サブディレクトリは予め作成しておく必要がありますが、こうすることで乱立するリポジトリを階層分けして整理することができます。
$ sudo -H -u gitosis mkdir /var/lib/gitosis/repositories/misc
gitosis.conf ではユーザが多いときなどバックスラッシュを入れることで、設定ファイル内でも改行することができます。
ユーザが多いときなどに可読性を上げることができ、とても便利です。
Hosting Git repositories, The Easy (and Secure) Way
多人数開発で Git を使う場合の環境構築 | GREE Engineers' Blog