gitosis - Git リポジトリ群の管理とアクセス制御 vol.1 の続編です。
前回までで、gitosis のインストールと疎通確認まで終わりました。もしエントリの通りに手を動かしていれば、手元には gitosis-admin.git のクローンがある状態のはずです。このエントリは gitosis の設定編ということで、gitosis-admin.git の説明をしていきます。
gitosis はアカウント情報やアクセス制御の情報を gitosis-admin.git を用いて管理します。アカウントの追加や削除やアクセス制御の変更を行うときには、僕たちは gitosis-admin.git の内容を変更することになります。
gitosis の設定変更の基本は以下の2ステップです。
- ローカルで gitosis-admin ディレクトリ以下のファイルを追加/変更/削除
- サーバ上の gitosis-admin.git に反映(git push)
それでは、まずはサーバ上の gitosis-admin.git を git clone して、ディレクトリ階層を見てみます。まだ gitosis-admin.git を手元に落としていない場合は以下の操作で手元に落としておきます。
local% git clone ssh://git@remote-name.com/gitosis-admin.git
ディレクトリの中を眺めてみます。以下のような構成になっており、非常に単純です。
gitosis-admin
|-- gitosis.conf # アクセス制御用の設定ファイル
`-- keydir
`-- keiji.pub # 登録されてるアカウントの公開鍵、keiji.pub は gitosis-init で指定した公開鍵
では gitosis.conf と keydir を個別に見ていきます。
gitosis.conf
gitosis.conf の中身は INIっぽいフォーマット で記述されいます。初期状態では以下のように自分自身(gitosis-admin)の設定のみが記述されています。
[gitosis] [group gitosis-admin] writable = gitosis-admin members = keiji
上記の内容は、ユーザ keiji がサーバ上のリポジトリ gitosis-admin.git を編集可能(writable) であることを定義しています。リポジトリコンテナの管理アカウントは、現時点では keiji のみとなります。
それでは、fred というアカウントを追加してこのアカウントがリポジトリコンテナの管理者としてふるまえるようにしてみます。
まずは上記 gitosis.conf の内容を編集します。
[gitosis] [group gitosis-admin] writable = gitosis-admin members = keiji fred
gitosis.conf の変更はこれだけです。簡単ですね。
ですが、これだけでは fred は git clone ssh://git@remote-name.com/gitosis-admin.git することはできません。fred はまだ gitosis のアカウントとして認証されていないからです。ここでようやく keydir の出番です。
keydir
keydir ディレクトリは認証された gitosis アカウントの公開鍵一覧を含みます。現時点では gitosis-init を実行したときに登録された最初のアカウント(keiji の公開鍵 keiji.pub)のみ登録されています。fred アカウントを有効にするには fred の公開鍵を keydir 以下に保存する必要があります。
ここでは仮に fred から公開鍵 id_rsa.pub を受け取ったとします。この鍵を gitosis-admin/keydir に保存します。
local% ls -F id_rsa.pub gitosis-admin/ local% mv id_rsa.pub fred.pub local% mv fred.pub gitosis-admin/keydir/ local% ls gitosis-admin/keydir/ keiji.pub fred.pub
id_rsa.pub のファイル名を変更したのには理由があります。gitosis はアカウント名として公開鍵のファイル名から拡張子 .pub を除いた部分を使用します。そのため keydir に保存するときは、公開鍵のファイル名を gitosis.conf で指定したアカウント名と併せておく必要があるのです。
さて、現時点ではローカル上では fred が存在して、サーバ上には存在しない状態です。これをサーバ上の gitosis-admin.git に反映する必要があります。ここからは git オペレーションになります。
local% cd gitosis-admin local% git commit -a -m "account 'fred' added. this account is administrator." local% git push
git push が上手くいけば、サーバ上の設定ファイルが自動的に更新されて fred が有効になります。1
これで fred は gitosis-admin.git をクローンすることができるようになっているはずです。fred ユーザで試してみます。
local% sudo su - fred local% mkdir -p workspace/hosting-self local% cd workspace/hosting-self local% git clone ssh://git@remote-name.com/gitosis-admin.git Initialized empty Git repository in /home/fred/workspace/hosting-self/gitosis-admin/.git/ remote: Counting objects: 24, done. remote: Compressing objects: 100% (24/24), done. remote: Total 24 (delta 6), reused 3 (delta 0) local% ls -F gitosis-admin/
上記のように gitosis-admin.git をクローンできれば成功です。2
ここまでで、アカウント追加の作業は終了です。
次は、現在存在するアカウント(keiji, fred)にそれぞれプライベートな(それぞれ自分だけが編集できる)リポジトリを与えてみます。gitosis.conf を以下のように変更して git push します。
[gitosis] [group gitosis-admin] writable = gitosis-admin members = keiji fred [group keiji] writable = private/keiji members = keiji [group fred] writable = private/fred members = fred
これで keiji は private/keiji.git、fred は private/fred.git。というリポジトリを与えられました。gitosis はコンテナ内にディレクトリ階層を作れるというのがポイントです。ここでは private というディレクトリを掘ってみました。private という名前に特に意味はありません(hoge でも fuga でも何でも良い)。
ただし gitosis.conf を push したら、サーバ上のコンテナに勝手に Git リポジトリが作られるわけではありません。単に push する権限を与えられるだけです。
ということで private/keiji の領域に収める Git リポジトリを作ってみたいと思います。まずはローカルの keiji ユーザで新しい Git リポジトリを用意します。
local% mkdir private-repo local% cd private-repo local% git init local% git remote add origin ssh://git@remote-name.com/private/keiji.git local% echo 'This git repository is private.' > README local% git commit -a -m 'Initial commit'
git remote add ssh://git@remote-name.com/private/keiji.git の指定が重要ですので間違えないように気をつけて下さい。そうしたら後は git push するだけです。
local% git push origin master
サーバ上に存在しないリポジトリを push すると、gitosis は以下のプロセスを経てリポジトリを同期します。
- コンテナ内にリポジトリが存在するかをチェック
- gitosis.conf に記述されているリポジトリ名かチェック
- 権限はあるかチェック
- Bare リポジトリを新しく作成
- git push されたリポジトリの内容とコンテナ内のリポジトリを同期
これで gitosis の一連の操作はカバーできたかなという感じがします。まだ触れていないものは、(現時点で僕が把握してる限り)以下の5つですね。
- アカウントの削除
- リポジトリの削除
- gitosis.conf のその他の細かい設定
- git-daemon について
- gitweb について
gitosis はリポジトリの削除はサポートしないようです。まぁ、削除は危険ですからね。リポジトリを本当に削除したい場合はサーバにログインして rm -rf すればいいでしょう。アカウントの削除は、単純に keydir ディレクトリから該当の公開鍵を削除して git push すれば ok です。簡単ですね。
git-daemon と gitweb については試してないので説明はできません。gitosis.conf の細かい設定については git://eagain.net/gitosis.git の中にある example.conf を見て頂ければ分かるでしょう。
ひとまずこれで終わりですが、gitosis 側で個々のリポジトリのフックを操れるようになれば post-receive にメール送信を仕込むとかより簡単に設定できるようになると思ってるので、今後ちょくちょく gitosis をいじっていくかもしれません。
- gitosis は git をトランザクション機能のあるミラーリングツールとして上手く使っているなと感じます。gitosis は git の post-update と post-receive フックを上手く使ってサーバ上の設定ファイルを更新しています ↩
- 「これではきちんとアクセス制御できているか分からない!」と感じる人がいると思います。そういう人は fred でクローンした gitosis-admin の gitosis.conf から fred の権限を削除して git push して、git pull してみると良いと思います。git push は成功しますが、git push した後の git pull は失敗するはずです。 ↩
Comments:2
- mogRampigo 09-05-25 (月) 17:41
-
Hi, outgoing posts there
through’s recompense the intriguing advice - taka 12-04-26 (木) 17:03
-
上記git-admin.gitをクローンする下りですが、
local% git clone ssh://git@remote-name.com/gitosis-admin.git > local% git clone ssh://git@remote-name.com:gitosis-admin.git
ではないでしょうか
Trackbacks:3
- Trackback URL for this entry
- http://openbooth.org/archives/82.html/trackback
- Listed below are links to weblogs that reference
- gitosis - Git リポジトリ群の管理とアクセス制御 vol.2 from openbooth
- pingback from gitosisを入れてみた | shoutack/blog 10-07-15 (木) 2:23
-
[...] [gitosis - Git リポジトリ群の管理とアクセス制御 vol.2 - openbooth] http://openbooth.org/archives/82.html [...]
- pingback from gitosis を使ってみた | Supernova 11-01-21 (金) 3:33
-
[...] Ubuntuサーバにgit/gitosis/gitwebを入れてみる gitosis – Git リポジトリ群の管理とアクセス制御 vol.2 [...]
- pingback from gitosis を使ってみた | Supernova 11-02-20 (日) 17:47
-
[...] Ubuntuサーバにgit/gitosis/gitwebを入れてみる gitosis – Git リポジトリ群の管理とアクセス制御 vol.2 [...]