gitosis による git サーバーの管理

更新


公開メモ

gitosis について

gitosis は、(複数の)git リポジトリの管理を容易に行うためのソフトウェア。
詳しい説明は、http://openbooth.org/archives/60.html あたりを参照のこと。

gitosis により管理されるサーバーには

git clone gitosis-account@some.your.server.com:some-project

のような形でアクセスすることになる。

some.your.server.com
gitosis をインストールしたサーバーのアドレス
gitosis-account
some.your.server.com に(通常は)1つだけ作成された gitosis 用のアカウント名
すべてのユーザーはこのアカウントを通じてリポジトリにアクセスする
some-project
git リポジトリの名前
1つの gitosis-account で複数の git リポジトリを管理することができる

リポジトリへのアクセス制御は公開鍵(rsa)ベースで、 ユーザーごと、そして、リポジトリごとに、 読み取り専用、または、読み書き可能、を指定できる。

git リポジトリの以下のような管理は、shell ログインすることなく git を使ってリモートから行える。

  • 新しいリポジトリの作成
  • ユーザーアカウントの追加・削除
  • リポジトリごと、ユーザーごとのアクセス制御

gitolite について

(2013-08-21 追記) 最近は gitosis よりも gitolite の方が人気があるのかもしれません。

https://www.google.co.jp/search?q=gitosis+gitolite
http://www.atmarkit.co.jp/ait/articles/1110/03/news112.html

gitlab について

(2014-05-12 追記) gitolite の GUI として人気のあった gitlab が、最近は gitolite に頼らずスタンドアローンで git の管理ができるようになっているのだそうです。

Ruby on Rails 製なので、低負荷なら Webrick で簡単に動かせますし、 それなりの環境を整えれば高負荷まで対応可能。自分だけの GitHub (のようなもの)を構築できるということで、 Web + Redis (+ MySQL) サーバを建てられる人限定ですが、お勧めです。 (低負荷であればデータベースは SQLite でも?)

https://www.gitlab.com/

バージョンアップの頻度が高いため、 インストールの仕方などはなるべく新しい情報を参照すると間違いがないと思います。

(2015-02-14 追記) インストールの大変さに、なかなか人気が出なかったせいでしょうか、 最近だと各種ディストリビューション用のパッケージも揃っているので、 面倒な設定をせずとも簡単に入れられるようでした。

LANG:console
$ wget https://downloads-packages.s3.amazonaws.com/debian-7.8/gitlab_7.7.2-omnibus.5.4.2.ci-1_amd64.deb
$ sudo dpkg -i gitlab_7.7.2-omnibus.5.4.2.ci-1_amd64.deb
$ sudo gitlab-ctl reconfigure

# ボート競合を回避する方法
# from http://d.hatena.ne.jp/toritori0318/20140524/1400955383
$ sudo jed /etc/gitlab/gitlab.rb
 external_url 'http://dora.bk.tsukuba.ac.jp:88/'
 unicorn['port'] = 18080
 postgresql['port'] = 15432
 redis['port'] = 16379
 ci_unicorn['port'] = 18181

これで 88 番ポートで繋がるようになりました。

初期パスワードは
http://d.hatena.ne.jp/toritori0318/20140523/1400863038

Username: root
Password: 5iveL!fe

でした。

GitBucket

(2015-02-13 追記) ダウンロードしてすぐ動かせるのが売りの(?) GitBucket というのもあるみたいですね。

Debian での gitosis のインストール

と同様にやれば良いんだけれど、 はまるのは、git というユーザーを使おうとするとうまく行かない事。

gitosis というユーザーが自動的に作られるので、それを使う。

手順としては、

  1. aptitude で gitosis をインストール (1行目:aptitude install)
  2. 1人目の管理者(自分)の公開鍵を用いて gitosis を初期化 (10行目:gitosis-init)
  3. 自分のアカウントからアクセスできることを確認する (17行目:ssh)
LANG:console
$ sudo aptitude install gitosis
 以下の新規パッケージがインストールされます:
   gitosis python-pkg-resources{a} python-setuptools{a} 
 更新: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
 284kB のアーカイブを取得する必要があります。展開後に 1217kB のディスク領域が新たに消費されます。
$ sudo su gitosis
gitosis$ cd
gitosis$ pwd
 /srv/gitosis
gitosis$ gitosis-init < ~osamu/.ssh/id_rsa.pub
 Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
 Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
gitosis$ ls -a
 .ssh     gitosis  repositories
gitosis$ exit
$ cd
$ ssh gitosis@localhost
 PTY allocation request failed on channel 0
 ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
 Connection to localhost closed.

最後の一行、エラーになっているように見えるが、**ログインが成功した後**、 何も Git のコマンドを指定していないので、接続が拒否された、という意味。

管理作業

を参考に、osamu@another-server をもう1人の管理者として登録してみる。

gitosis のリポジトリ管理情報は、それ自体1つの git リポジトリで管理されているので、 その編集手順は次のようになる。

  1. 管理情報リポジトリである gitosis-admin をローカルにコピー : git clone
  2. 管理情報をローカルで編集 : gitosis.conf をエディタで編集したり、公開鍵を keydir にコピーしたり
  3. 編集結果をローカルリポジトリに登録 : git add / git commit
  4. ローカルリポジトリをサーバーに送信 : git push
LANG:console
$ git clone gitosis@localhost:gitosis-admin.git
 Initialized empty Git repository in /home/osamu/gitosis-admin/.git/
 remote: Counting objects: 5, done.
 remote: Compressing objects: 100% (4/4), done.
 remote: Total 5 (delta 0), reused 5 (delta 0)
 Receiving objects: 100% (5/5), done.
$ ls
 gitosis-admin
$ cd gitosis-admin/
$ ls
 gitosis.conf    keydir
$ ls keydir
 osamu@debian-server.pub
$ cat gitosis.conf
 [gitosis]
 
 [group gitosis-admin]
 writable = gitosis-admin
 members = osamu@debian-server
$ jed gitosis.conf
 [gitosis]
 
 [group gitosis-admin]
 writable = gitosis-admin
 members = osamu@debian-server, osamu@another-server
$ scp osamu@another-server:.ssh/id_rsa.pub keydir/osamu@another-server.pub
$ ls keydir
 osamu@another-server    osamu@debian-server
$ git add keydir/osamu@another-server.pub
$ git commit -a
 Created commit d7e6afb: osamu@another-server.pub was added as admin
  1 files changed, 1 insertions(+), 0 deletions(-)
  create mode 100644 keydir/takeuchi@dora.pub
$ git status
 # On branch master
 nothing to commit (working directory clean)
$ git push
 Counting objects: 6, done.
 Compressing objects: 100% (4/4), done.
 Writing objects: 100% (4/4), 730 bytes, done.
 Total 4 (delta 0), reused 0 (delta 0)
 To gitosis@localhost:gitosis-admin.git
    31412ce..d7e6afb  master -> master

これで、新しいユーザーが追加され、 登録した公開鍵を使って gitosis アカウントにログイン可能になっている。

LANG:console
$ ssh osamu@another-server
$$ git clone gitosis@gitosis.server:gitosis-admin.git
 Initialized empty Git repository in ~/gitosis-admin/.git/
 remote: Counting objects: 10, done.
 remote: Compressing objects: 100% (9/9), done.
 remote: Total 10 (delta 1), reused 4 (delta 0)
 Receiving objects: 100% (10/10), done.
 Resolving deltas: 100% (1/1), done.
$$ rm -r gitosis-admin

うまく行っている。

管理情報の構成

gitosis の管理情報は以下のようなファイル構成になっている。

gitosis-admin/
  gitosis.conf
  keydir/
    osamu@another-server.pub
    osamu@debian-server.pub
gitosis.conf
管理情報フォルダのルートにある
リポジトリごと、ユーザーアカウントごとのアクセス制御情報が書かれている
keydir/*
ユーザーアカウントごとの公開鍵がユーザー名と同名のファイルとして保存される

gitosis.conf の設定方法

使い方は /usr/share/doc/gitosis/example/* を見る。

基本は、

[group グループ名]
members = member1 member2 member3 @other-group ...
writable = リポジトリ1 リポジトリ2 リポジトリ3 ...
readonly = リポジトリ1 リポジトリ2 リポジトリ3 ...

という設定。

member? は keydir/* に保存した公開鍵ファイルの名前で指定する。
他のグループ名を @ 付きで指定することもできる。

gitosis-admin リポジトリ自体もこの形式のアクセス制御が可能なので、 上記のように複数の管理者アカウントを作成・管理することができる。

あとは、必要に応じてリポジトリごとの設定。

[repo リポジトリ1]
## Allow gitweb to show this repository.
#gitweb = yes

## Oneline description of the project, mostly for gitweb.
#description = blah blah

## Owner of this repository. Used in gitweb list of projects.
#owner = John Doe

## Allow git-daemon to publish this repository.
#daemon = yes

設定は、書き換えたら

LANG:console
git commit -a -m "message"
git push

を忘れずに行う。

ユーザーの追加・削除

上記の通り、keydir に追加したいユーザーの公開鍵をユーザー名と同じファイル名で保存し、 gitosis.conf の適当なグループにそのユーザー名を追加する。

削除するには、gitosis.conf からユーザー名を削除する。

新たなリポジトリを作成する

新しいリポジトリを作成するには、まず上記方法でリポジトリへの書き込み権限を作ってから git push することになる。

以下では、新たに my_project というリポジトリに対して、 読み書き可能なユーザーグループ myteam を作成し、 member1, member2, member3 の3人をメンバーとして登録する。

その後、ローカルの my_project リポジトリをサーバーに push することで、 サーバー上に my_project というリポジトリを作成する。

LANG:console
$ git clone gitosis@my.debian-server.com:gitosis-admin.git
  ...

$ cd gitosis-admin/
$ jed gitosis.conf
...

[group myteam]
members = member1 member2 member3
writable = my_project
...

$ git commit -a -m "my_project created"
$ git push
$ mkdir my_project
$ cd my_project
$ git init
$ git remote add origin gitosis@git.server.com:my_project.git
$ # do some work, git add and commit files
$ git push origin master:refs/heads/master

リポジトリを削除する

リモートから行うことはできない。

すべてのユーザーから読み書きの権限を剥奪することでリポジトリが存在しないのと 同じ状況にすることはできるが、実際にデータ自体を削除するためには Shell ログインの後、

gitosis/repositories にて、sudo rm -rf project-name などとする必要がある。

ちなみに、~gitosis は Debian のデフォルトでは /srv/gitosis になっている。

フックの使い方

git リポジトリにフックを仕込むことで、リポジトリの更新時にメールを送信するなどが 可能となる・・・のではないかとの記述を目にした。後で調べてみよう。

(2011/03/24 追記)
http://labs.gree.jp/blog/2011/03/2885/
こちらのサイトに詳しく使い方が紹介されていました。

コメント

自由にコメントを付けて下さい。





Counter: 46055 (from 2010/06/03), today: 5, yesterday: 10