Gitosis
Gitosis はサーバー上の Git リポジトリのアクセス制御やリモート管理をするためのツールです。SSH 経由の読み書き権限を細かく管理することができ、サーバー上にローカルシステムアカウントを作成する必要がありません。Git を扱うときは git
アカウントだけが使われます。
Gitosis は README ファイルにインストール手順を記載しています。以下のガイドは README を元に作成しています。
目次
インストールとセットアップ
AUR から gitosis-gitAUR パッケージをインストールしてください。以下のものが作成されます:
git
ユーザー。git
ユーザーが所属するgit
グループ。- Gitosis のデータやリポジトリを保存する
/srv/gitosis
ディレクトリ。
Gitosis を設定するとき、サーバー上のファイルを直接編集することはありません。代わりに、Gitosis は設定のための Git リポジトリを用意します。設定を更新するには、gitosis-admin
リポジトリを複製して、コミットし、プッシュしてください。他のリポジトリと扱い方は変わりません。
Gitosis は SSH 鍵を使用してユーザーを認証するため、管理リポジトリ用にキーペアを生成する必要があります。キーペアがない場合、ssh-keygen
を使うことで生成できます:
$ ssh-keygen -t rsa
以下のコマンドで管理リポジトリを初期化できます:
$ sudo -H -u git gitosis-init < /path/to/public_key.pub Initialized empty Git repository in /srv/gitosis/repositories/gitosis-admin.git/ Reinitialized existing Git repository in /srv/gitosis/repositories/gitosis-admin.git/
上記のコマンドによってホストされるリポジトリを保存するのに使われる /srv/gitosis/repositories
ディレクトリも作成されます。
管理者リポジトリの初期化が完了したら、git ユーザーのパスワードによる SSH ログインを無効化したほうが良いでしょう。
/etc/ssh/sshd_config
の末尾に、以下を追加してください:
Match User git PasswordAuthentication no
設定
上で書いたように、Gitosis の設定は gitosis-admin
リポジトリにプッシュすることで行います。リポジトリを複製するには、以下のコマンドを実行:
$ git clone git@your.git.server:gitosis-admin.git
gitosis-admin
リポジトリには以下のファイルとディレクトリが存在します:
gitosis.conf
– Gitosis やリポジトリのパーミッションの設定ファイルkeydir
– 各ユーザーの公開鍵を保存するディレクトリ
リポジトリやユーザーの設定を変更したり Gitosis を設定するときは、変更をコミットしてサーバーにプッシュしてください。
リポジトリとパーミッション
/usr/share/doc/gitosis
にサンプル設定ファイルが存在します:
[gitosis] gitweb = yes [repo foobar] description = Git repository for foobar owner = user [group devs] members = user1 user2 [group admins] members = user1 [group gitosis-admin] writable = gitosis-admin members = @admins [group foobar] writable = foobar members = @devs [group myteam] writable = free_monkey members = jdoe [group deployer] writable = free_monkey readonly = monkey_deployer
上記では "free_monkey" という名前の新しいグループを定義しています (名前は自由です)。myteam メンバーの "jdoe" は "gitosis" リポジトリの書き込み権限を持っています。"monkey_deployer" は "free_monkey" への読み取り権限しか持っていません。
変更した gitosis.conf
ファイルを保存したらコミットしてプッシュします:
$ git commit -a -m "Allow jdoe write access to free_monkey" $ git push
ユーザー "jdoe" が "free_monkey" という名前のリポジトリに書き込めるようになりましたが、まだリポジトリを作成していません。新しいリポジトリをローカルで作成して、Git サーバーで初期化し、プッシュしてください:
$ mkdir free_monkey $ cd free_monkey $ git init $ git remote add origin git@YOUR_SERVER_HOSTNAME:free_monkey.git
何か変更を加えたら git add を実行してファイルをコミットします:
$ git push origin master:refs/heads/master
SSH を使用している場合、"does not appear to be a Git repository" というエラーメッセージを表示してコマンドが失敗します。サーバー上で手動でリポジトリを初期化することで解決できます:
$ git init --bare /srv/gitosis/repositories/free_monkey.git
コマンドを再度実行してみてください。
サーバー (/srv/gitosis/repositories
) 上に "free_monkey" リポジトリを作成できたら、後は他の Git リポジトリと同じように使うことができます。
Gitosis のリポジトリは gitweb から使うこともできます。gitweb の設定でリポジトリが含まれているディレクトリを指定してやってください。
ユーザーの追加
次にすることは当然、幸運なひと握りの人たちに FreeMonkey プロジェクトへのコミット権限を与えることです。2ステップで行うことができます。
まず、ユーザーの SSH 公開鍵を入手して (ここでは仮に "alice.pub" と "bob.pub" とします)、gitosis-admin リポジトリの keydir/
ディレクトリに保存してください。次に、gitosis.conf
を編集してユーザーを "members" リストに追加します:
$ cd gitosis-admin $ cp ~/alice.pub keydir/ $ cp ~/bob.pub keydir/ $ git add keydir/alice.pub keydir/bob.pub
鍵のファイル名には ".pub" 拡張子が必要です。
gitosis.conf
は以下のように変更します:
[group myteam] members = jdoe alice bob writable = free_monkey
コミットしてプッシュ:
$ git commit -a -m "Granted Alice and Bob commit rights to FreeMonkey" $ git push
これで Alice と Bob は以下のコマンドで free_monkey リポジトリを複製してコミットできるようになります:
$ git clone git@YOUR_SERVER_HOSTNAME:free_monkey.git
公開アクセス
公開プロジェクトの場合、特定のユーザーにコミット権限を与え、他の人にも読み取り権限を与えることになります。
git-daemon を使うことで SSH 鍵を使わずに読み取れるようになります。git-daemon は Gitosis とは直接関係していないツールで Git に付属しています。
$ sudo -u git git-daemon --base-path=/srv/gitosis/repositories/ --export-all
上記のコマンドで Gitosis で管理している全てのリポジトリが誰からでも読み込めるようになります。以下のコマンドで FreeMonkey を複製できます:
$ git clone git://YOUR_SERVER_HOSTNAME/free_monkey.git
一部のリポジトリだけを公開したい場合、公開したい各リポジトリのルートディレクトリ (例 /srv/gitosis/repositories/free_monkey.git
) に git-daemon-export-ok ファイルを作成してください。そして上記の git-daemon コマンドから "--export-all" を外して実行してください。
他の設定
gitosis.conf
では他のことも設定できます。Gitosis のソースディレクトリにある example.conf
には全てのオプションの説明が書かれています。一部のリポジトリを非公開の読み取り専用リポジトリにしたり、グループメンバーのリストから他のグループを読み込んだりすることができます。
変更をプッシュしてもサーバー上の /srv/gitosis/.gitosis.conf
が更新されない場合、post-update フックが実行できないことが原因かもしれません。古いバージョンのセットアップツールでは権限が設定されないことがあります。以下のコマンドで修正できます:
# chmod 755 /srv/gitosis/repositories/gitosis-admin.git/hooks/post-update
Python が標準ディレクトリに存在しない場合、post-update を編集して一番上に "export PYTHONPATH=..." を記述してください。設定しないと gitosis-admin で変更をプッシュしたときに Python のスタックトレースが表示されてしまいます。
Gitosis を標準のディレクトリ以外にインストールすることは推奨しません。
非標準の SSH ポート
サーバーで動作させている SSH のポートが標準のポートではない場合、Git で接続するポートを指定する方法が2つあります。1つは SSH プロトコルの使用を明示的に指定して、URL にポート番号も加える方法です:
git clone ssh://git@myserver.com:1234/repo.git
もしくは ~/.ssh/config
ファイルに以下を記述してください:
Host myserver.com Port 1234
- [repo] ブロックは gitweb で使用するのに必要な領域を定義します。
- [group] ブロックは以下のために使われます:
- ユーザーグループの定義
- リポジトリのパーミッションの定義
- @ はユーザーグループの定義に使われます。
ファイルに変更を加えたらコミット・プッシュしてください。
keydir
keydir はユーザーの公開鍵を保存するディレクトリです。鍵によっては user@machine という形式になっていることがあり gitosis.conf
で鍵の形式を定義する必要があります。ユーザーグループを作成してリポジトリのメンバーとして使用すると良いでしょう。新しいユーザーが使えるように鍵を追加したら、Git リポジトリにファイルを追加してコミット・プッシュしてください。gitosis-admin リポジトリを複製したときと同じような Git コマンドが新しいユーザーから使えるようになります。
参照
- Gitosis のソース
- Gitolite – Gitosis と同じような機能を提供する Gitosis の代替
- Girocco – repo.or.cz で使われている Git ホスティングコード
- Gitorious – オープンソースの Git ホスティング
- Gitlab – Ruby on Rails と Gitolite によるフリーの Git リポジトリ管理アプリケーション。