質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

gitolite-adminをローカルにクローンできない

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,692

score 27

GitoliteをAWSのEC2環境で設定しています。

通信テストしたら無事に以下メッセージが表示されました。
ssh -i id_rsa_gitolite_hogehoge gitolite@ec2-000-000-000-000.compute-1.amazonaws.com
hello gitolite-admin_hogehoge, this is gitolite@ip-000-000-000-000 running gitolite3 v3.6.3-11-g2417156 on git 2.1.0

 R W    gitolite-admin
 R W    testing
Connection to ec2-000-000-000-000.compute-1.amazonaws.com closed.

configも設定しました。
/.ssh/config
Host ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com
  IdentityFile ~/.ssh/id_rsa_hogehoge

gitolite-adminをローカル環境にcloneしようとしたら・・・
git clone gitolite@ec2-52-4-114-0.compute-1.amazonaws.com:gitolite-admin
Cloning into 'gitolite-admin'...
Permission denied (publickey).
fatal: Could not read from remote repository.

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

logを見てみたら・・・
tail -f /var/log/secure
Aug 19 03:24:35 ip-000-000-000-000 sshd[3115]: Connection closed by 000.000.000.000 [preauth]

いろいろ試してみたんですが、うまくいかなかったので質問しました。
解決方法ご存知の方、教えて頂けると幸いです。
どうぞよろしくお願い致します。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

準備

gitolite をインストールする前に、必要な環境を整えましょう。 gitolite のドキュメントによると、必要なものは以下のとおりです。

git バージョン 1.6.2 以上
perl
OpenSSH
ServersMan@VPS (debian) では perl と OpenSSH は標準でインストールされているので、以下では git のインストールを行います。さらに、 Git リポジトリへアクセスするために使用するユーザーも作成します。当然ですが、以下の作業は root で行ってください。

git のインストール

git のインストールは apt-get コマンド一発…といきたいところですが、残念ながら現在の debian (lenny) でインストールされる git はバージョン 1.5 系とかなり古いもので、 gitolite は動作しません。そこで、パッケージの取得元に lenny-backports を加えて、新しい git がインストールできるようにします。具体的には、以下のコマンドを実行します(読みやすさから行を分けていますが、一行で入力してください)。

echo "deb http://backports.debian.org/debian-backports lenny-backports main"
  > /etc/apt/sources.list.d/lenny-backports.list
そして、パッケージリストをアップデートし、 git をインストールします。

apt-get update
apt-get -t lenny-backports install git
これで gitolite が動作する git (たぶん git 1.7 系)がインストールされるはずです。以下のコマンドでバージョンが 1.6.2 以上であることを確認してください。

git --version
リポジトリアクセス用のユーザーを作成する

次に、 Git リポジトリへのアクセスのために共通で利用するローカルユーザーを作成しておきます。名前は「git」だと標準のなにかにバッティングしそうなので、私は「gituser」にしておきました。基本的に以下のコマンドを実行すれば良いはずです。

useradd -m -U gituser
passwd gituser
# gituserのパスワードを2回入力
gitolite のスクリプトは $HOME/bin にインストールされるので、それを実行パスに追加する必要があります。私は遭遇しませんでしたが、 gitolite を使って SSH アクセスした際に実行パスが設定されないことがあるようなので、念のため .bashrc の先頭に以下の行を挿入しておくのが無難かと思います。

export PATH="/home/gituser/bin:/home/gituser/bin:/usr/local/bin:/usr/bin"
以上で gitolite に必要な環境が整いました。

gitolite のインストール

それでは gitolite をインストールしましょう。実は debian の lenny-backports には gitolite のパッケージがあり、それを利用してインストールすることも可能です。しかし、 gitolite のインストールはとても簡単なので、ここでは多くの環境で利用できる、通常ユーザー権限でのインストール方法を使います。この方法なら debian 以外のディストリビューションはもちろん、 root 権限のない共有サーバーでも対応できるはずです。

root 権限不要のインストール方法なので、以下の作業は gituser で行ってください。

管理ユーザー用の認証鍵の作成

gitolite では、各ユーザーは認証鍵(公開鍵・秘密鍵のペア)により識別されます。インストール時には管理者用公開鍵を指定する必要があるので、自分の公開鍵を gituser が読み込める場所にコピーしておいてください。ここでは以下のパス($HOME は gituser のホームディレクトリ)にコピーしたと仮定します。

$HOME/admin.pub
※ root 権限を持っていない場合は、ここで使用する公開鍵は普段のログイン用とは別のものにしてください。詳細は後述。

gitolite のインストール

公開鍵の準備ができたら、いよいよ gitolite のインストールです。基本的には、以下のコマンドを順番に実行するだけです。

mkdir -p $HOME/bin $HOME/gitolite/conf $HOME/gitolite/hooks
git clone git://github.com/sitaramc/gitolite gitolite-source
cd gitolite-source
src/gl-system-install $HOME/bin $HOME/gitolite/conf $HOME/gitolite/hooks
gl-setup $HOME/admin.pub
gl-setup の実行後、エディタが開いて設定ファイルを編集できます。もっとも、多くの場合はデフォルトで大丈夫だと思います。設定は ~/.gitolite.rc を編集することでいつでも変えられます。

以上でインストールは終了です。

管理用 Git リポジトリを取得する

gitolite では、ユーザーやリポジトリの追加などの管理作業は、すべて gitolite-admin という Git リポジトリのファイルを変更して push することにより行います。そこで、まずは自分のクライアントマシンにこのリポジトリを clone します。 Git リポジトリのあるサーバーのホスト名を仮に「gitserver.com」とすると、以下のコマンドで取得できます。

git clone gituser@gitserver.com:gitolite-admin
これで、カレントディレクトリ内に gitolite-admin ディレクトリが作成され、管理用のファイルがその中に作成されるはずです。

ユーザーやリポジトリの追加

前述のとおり、 gitolite での管理作業はすべて、 gitolite-admin リポジトリに変更を push することで行います。ここでは、ユーザーの追加とリポジトリの追加の方法をご紹介します。以下の作業は自分のクライアントマシン(上で gitolite-admin リポジトリを clone したマシン)上で実行してください。

ユーザーの追加

gitolite は認証鍵(公開鍵・秘密鍵ペア)によってユーザーを識別します。したがって、ユーザーを追加するには、まずそのユーザーの認証鍵を作成しなければなりません。認証鍵は以下のコマンドで作成できます。

ssh-keygen -t rsa
実行すると認証鍵のファイル名を尋ねてくるので、適当に入力してください(くれぐれも自分の認証鍵を上書きしないように!)。ここでは ~/foo と入力したと仮定します。続けてパスフレーズを尋ねてきますが、これはお好みで。

作成した秘密鍵はそれを使用するユーザーに渡し、公開鍵は gitolite-admin/keydir にコピーします。

cp ~/foo.pub /path/to/gitolite-admin/keydir
そして、この変更をコミットしておきます。

cd /path/to/gitolite-admin
git commit -a
これでユーザーの追加は完了です。実際にサーバーに反映するためには push しなければなりませんが、その前にユーザーがアクセスするリポジトリを作成(もしくは既存のリポジトリへのアクセスを許可)しなければ意味がないので、その作業に移ります。

リポジトリの追加

リポジトリと各ユーザーのアクセス権限は gitolite-admin/conf/gitolite.conf で管理されています。インストール直後にこのファイルを開くと、以下の内容になっているはずです。

repo    gitolite-admin
        RW+     =   admin

repo    testing
        RW+     =   admin
これは、 gitolite-admin, testing という 2 つのリポジトリがあり、いずれも admin ユーザーのみがアクセスできることを表しています。 gitolite.conf の基本的な文法は以下のとおりです。

repo    [リポジトリ名]
        [アクセス権限] = ユーザー名 [ユーザー名...]
        ...
上記のうち、 [リポジトリ名] はそれ以降でアクセス権限を指定するリポジトリ名、 [ユーザー名] はアクセス権限を設定するユーザーの名前(公開鍵のファイル名部分)です。 [アクセス権限] には以下の 3 つを指定できます。

指定    権限
R    読み込みのみ
RW    読み込み / 書き込み
RW+    読み込み / 書き込み / rewind
したがって、新しいリポジトリ「newrepo」を作成し、 admin ユーザーにフルアクセスを、 foo ユーザーに読み込みのみを許可するなら、 gitolite.conf に以下の内容を追加します。

repo    newrepo
        RW+     = admin
        R       = foo
そして、変更をコミットします。

cd /path/to/gitolite-admin
git commit -a
これで新しいリポジトリの作成の指定ができました。

変更の適用

これまでの変更はローカルのリポジトリ上でのものなので、実際にサーバーに適用するには push する必要があります。方法はもちろんご存知かと思いますが、以下のコマンドを実行するだけです。

cd /path/to/gitolite-admin
git push
これで gitolite-admin リポジトリの変更がローカルからサーバーに転送されると同時に、その内容にしたがって ~/.ssh/authorized_keys への公開鍵の追加やリポジトリの作成など、必要な作業がすべて実行されます。

試しに newrepo リポジトリを clone してみてください。

git clone gituser@gitserver.com:newrepo
空のリポジトリが clone されるはずです。

その他の Tips

以下、上記の作業中に気づいたことなど。

SSH のポート番号を変更している場合

gitolite 経由でリポジトリにアクセスする場合、必ず「ユーザー@サーバー:リポジトリ」形式でリポジトリ指定をしなければならず、「ssh://〜」のような URL 形式は使えません。したがって、ポート番号が変更されている場合は ~/.ssh/config で指定しておく必要があります。また、リポジトリアクセスに専用の認証鍵を使用する場合もこの方法が使えます。

Host [ホスト名]
    Port [ポート番号]
    IdentityFile /path/to/secret_key_rsa
こんな感じで ~/.ssh/config に書いておけばよいかと思います。

共有サーバーに gitolite をインストールする際の注意点

共有サーバーの場合など、自分が普段ログインユーザーとして使っているユーザーと同じユーザーで gitolite をインストールする際は、インストール時に指定する管理者用公開鍵を普段のログイン用公開鍵とは別にしてください。ここで同じものを使用してしまうと、その鍵でのログインが Git リポジトリへのアクセスのみに制限されてしまいます。とくにパスワードログインが禁止されている場合はログイン不可能になってしまうので、注意してください。

また、共有サーバーなどで標準とは違うパスに git がインストールされている場合は、 .gitolite.rc で $GIT_PATH にそのパスを設定する必要があります。

さらに詳細な指定

私はリポジトリ単位でアクセス制限ができれば十分だったので詳しく調べていませんが、設定次第で特定のタグ・ブランチに対するアクセス制限やユーザーのグループ化などの機能が利用できるようです。詳細はインストール時にサーバーに clone した gitolite-source リポジトリにある conf/example.conf に書いてあるので、必要な方はそちらを参照してください。

以上、本日は gitolite を使用して Git リポジトリへの SSH アクセスを制御する方法をご紹介しました。この方法を使えば、自分のサーバーに作成した Git リポジトリを簡単に他人に公開し、共同作業が行えます。 Git の利用の幅が一気に広がりますので、ぜひお試しください!

補足情報

gitolite と同様な機能を持つ gitosis の解説が GREE Engineers' blog で公開されています。 Hook スクリプトを使ったメール通知なども解説されているので、 gitolite を使っていても参考になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る