Gitosis

提供: ArchWiki
移動先: 案内検索

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/
ノート: 場合によってhあ、以下のようなエラーが発生することがあります:
OSError: [Errno 13] Permission denied: '//gitosis'

git のホームディレクトリが正しく設定されていないのが原因です。手動で設定することで解決します:

# usermod -d /srv/gitosis 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 コマンドが新しいユーザーから使えるようになります。

参照