̃Gg[͂ĂȃubN}[Nɒlj

Unix :: git / gitosis



gitosis は、複数の git リポジトリの管理を行うためのソフトウェアです。
gitosis-admin.git という管理用の git リポジトリを用い、gitosis.conf でどのユーザがどのリポジトリにアクセスできるのかを管理します。

  • gitosis のインストール
% sudo yum install gitosis

もし上記でインストールできない場合は「epelレポジトリ」を導入する

1. EPEL レポジトリをダウンロード

  • Fedora EPEL (Extra Packages for Enterprise Linux)
% wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/<V>/x86_64/epel-release-<V>-<R>.noarch.rpm
  • <V>: CentOS のメジャーバージョン
  • <R>: リビジョン番号


2. リポジトリを追加

% sudo rpm -Uvh epel-release-6-8.noarch.rpm


3. 通常は利用しないようにしておく

% sudo vi /etc/yum.repos.d/epel.repo
 :
enabled=0 # 一番上の「enabled」を0に変更
 :


4. yum install

% sudo yum --enablerepo=epel install gitosis

  • ssh経由で様々なコマンドを実行するため、下記コマンドで gitosis に ssh 公開鍵を設定します
% sudo -H -u gitosis gitosis-init < ~/.ssh/authorized_keys
Initialized empty Git repository in /var/lib/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /var/lib/gitosis/repositories/gitosis-admin.git/

下記のようなエラーが出る場合は、公開鍵の末尾に「ユーザー名@ホスト名」が記載されていないのが原因です。

Traceback (most recent call last):
  File "/usr/bin/gitosis-init", line 7, in ?
    sys.exit(
  File "/usr/lib/python2.4/site-packages/gitosis/app.py", line 24, in run
    return app.main()
  File "/usr/lib/python2.4/site-packages/gitosis/app.py", line 38, in main
    self.handle_args(parser, cfg, options, args)
  File "/usr/lib/python2.4/site-packages/gitosis/init.py", line 121, in handle_args
    user = ssh_extract_user(pubkey)
  File "/usr/lib/python2.4/site-packages/gitosis/init.py", line 39, in ssh_extract_user
    raise InsecureSSHKeyUsername(repr(user))
gitosis.init.InsecureSSHKeyUsername: Username contains not allowed characters: 'xxxxxxxxxx...'

公開鍵をコピー(cp -a)して、下記のように末尾に適当(適切)な「ユーザー名@ホスト名」を追記します。

% cd ~/.ssh
% cp -a authorized_keys authorized_keys2
% vi authorized_keys2

...xxxxxxxxx username@hostname

「ユーザー名@ホスト名」を追記した公開鍵を authorized_keys2 とし、改めてコマンドを実行します。

% sudo -H -u gitosis gitosis-init < ~/.ssh/authorized_keys2

  • 下記ファイルに鍵情報が登録されます。
/var/lib/gitosis/.ssh/authorized_keys


gitosis は、自身の管理も git を通して行います。
そのリポジトリが gitosis-admin.git であり、ここに設定ファイルや鍵が保存されます。
以下は、gitosis-admin.git を clone する手順になります。

管理方法としては、例えば、プロジェクトのルートディレクトリ「projects」等を作り、その配下で各プロジェクトを管理するとします。

|-- projects
|   |-- gitosis-admin <- git clone して、ここ配置する
|   |-- proj1
|   |-- proj2
|   |-- proj3
  • gitosis-admin.git を clone する
% mkdir ~/projects
% cd ~/projects
% git clone ssh://gitosis@localhost/gitosis-admin.git

git clone した時、以下のように怒られる場合の対処方法

% git clone ssh://gitosis@localhost/gitosis-admin.git
Cloning into 'gitosis-admin'...
Permission denied (publickey,gssapi-with-mic).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

原因はいろいろ考えられるが、今回の場合、sshd_config の UsePAM が原因でした。
(原因究明まで、半日潰しました。。)

  • 対処方法:UsePAM の設定を no → yes に変更
% sudo vi /etc/ssh/sshd_config

UsePAM no
#UsePAM yes

 ↓変更

#UsePAM no
UsePAM yes
  • UsePAM no: no に設定すると、パスワード未設定のユーザはログインできないようです。(鍵認証も無効です)
    • ユーザー:gitosis のパスワードは当然「未設定」です。
  • UsePAM yes: yes に設定することで、上記を回避します。(パスワード未設定ユーザーのログインを許可します)


  • UsePAM の設定後、sshd の再起動を忘れずに
% sudo /etc/init.d/sshd restart


ちなみに今回、/var/log/secure を見て、UsePAM の設定が原因であることに辿り着きました。
下記のようなログが出力されていたら、PAM の設定を疑ってみてください。

% sudo less /var/log/secure
 :
... User gitosis not allowed because account is locked
 :
  • 今回もまた、ログの重要さに改めて気づく。
  • 何かあったら、まずはログを見るくせをつけると、時間を無駄にしないで済む場合が多い(反省

  • 気を取り直して、git clone する
% git clone ssh://gitosis@localhost/gitosis-admin.git
Cloning into 'gitosis-admin'...
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.

出来た!ひゃっほー


関連エントリー

    • ソースコードを管理するために使われるオープンソースの分散型バージョン管理システム
  1. gitosis
    • 複数の git リポジトリ管理に対応したソフトウェア
    • CUI の git リポジトリブラウザ





unix/software/gitosis.txt