gitosis による git サーバーの管理 のバックアップソース(No.4)

更新

[[公開メモ]]

#contents

* gitosis について [#kf89cbe7]

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

gitosis により管理されるサーバーには
 git clone gitosis-account@some.your.server.com:your-gitosis-project

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

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

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

git リポジトリの管理は、shell ログインすることなくリモートから行える。
- 新しいリポジトリの作成
- ユーザーアカウントの追加・削除
- リポジトリごと、ユーザーごとのアクセス制御

* Debian での gitosis のインストール [#l4afdd75]

- http://openbooth.org/archives/65.html

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

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

手順としては、
+ aptitude で gitosis をインストール (1行目)
+ 1人目の管理者(自分)の公開鍵を用いて gitosis を初期化 (10行目)
+ 自分のアカウントからアクセスできることを確認する (17行目)

 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.

* 管理作業 [#u5d1b577]

- http://openbooth.org/archives/82.html

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

gitosis のリポジトリ管理情報は、それ自体1つの git リポジトリで管理されている。

手順は、
+ 管理情報リポジトリ gitosis-admin をローカルにコピー : git clone
+ 管理情報をローカルで編集  : jed など
+ 編集結果をローカルリポジトリに登録 : git add / git commit
+ ローカルリポジトリをサーバーに送信 : 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.
 $ cd gitosis-admin/
 $ ls
  gitosis.conf
  
  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
 $ 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

うまく行っている。

* 管理情報の構成 [#xf612861]

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

 gitosis-admin/
   gitosis.conf
   keydir/
     osamu@another-server.pub
     osamu@debian-server.pub

:gitosis.conf| 管理情報フォルダのルートにある~
リポジトリごと、ユーザーアカウントごとのアクセス制御情報が書かれている
:keydir/*| ユーザーアカウントごとの公開鍵

** gitosis.conf の設定方法 [#u6460df3]

使い方は /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

を忘れずに行う。

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

 LANG:console
 $ git clone gitosis@git.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:free_monkey.git
 $ # do some work, git add and commit files
 $ git push origin master:refs/heads/master

* コメント [#z8ca5a65]

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

#article_kcaptcha

Counter: 45190 (from 2010/06/03), today: 4, yesterday: 0