CentOSサーバーに分散型バージョン管理システム Gitのサーバー(リモートリポジトリ)を構築し、下記のポリシーで運用することにします。
  1. Gitサーバーへは SSH公開鍵による接続のみ許可します
  2. リポジトリやユーザーの管理は Gitoliteで行います
Gitoliteで管理しますので、クライアントユーザーは

ssh://gitproject@Gitサーバー/リポジトリ

で Gitサーバー内のリポジトリにアクセスします。
※ユーザー名が gitproject 固定になります。
※Gitoliteをインストールしたユーザーgitprojectとした場合のユーザー名です。

事前準備

コンパイル/インストールするために必要なパッケージを yumでインストールします。

※Git公式サイトのドキュメント に記載されているパッケージです。

関連パッケージのインストール
[root]  yum -y install \
      >   curl-devel \
      >   expat-devel \
      >   gettext \
      >   openssl-devel \
      >   zlib-devel \
      >   perl-ExtUtils-MakeMaker
4行目:公式サイトでは gettext-develです。

gettext-develですと依存関係によりパッケージ版の git-1.8.3.1がインストールされてしまいます。
gitのインストールで必要としている msgfmtは gettextにも入っていますので、gettext-develから変更しています。

インストール

2015/06/24時点の最新バージョンは 2.4.4なのですが、yumでインストールされる CentOS7のパッケージバージョンは 1.8.3.1ですので、ソースから最新バージョンをインストールすることにします。
gitのダウンロードとインストール
# ソースファイルを githubから /usr/local/src にダウンロードします
[user]$ cd /usr/local/src
[user]$ wget https://github.com/git/git/archive/master.zip -O git-master.zip

# ダウンロードしたファイルを展開して、コンパイルを行います
[user]$ unzip git-master.zip
[user]$ rm git-master.zip
[user]$ cd git-master
[user]$ make configure
[user]$ ./configure \
      >   --prefix=/usr/local \
      > 2>&1 | tee configure.log
[user]$ make 2>&1 | tee make.log

# rootユーザーでインストールします
[user]$ sudo env PATH=$PATH paco -D make install 2>&1 | tee make_install.log

# インストールバージョンを確認します
$ git --version
git version 2.4.0.GIT
11行目
インストール先を指定します
16行目
ソースインストールパッケージ管理ツール paco を使用してインストールしています
20行目
2015/06/24時点の zipパッケージからインストールした場合のバージョンです

Gitの更新

新しいバージョン/リビジョンの Gitへの更新は GitHubから git cloneで取得して行います。
Gitの更新
# GitHubから新しいバージョン/リビジョンのGitを取得します
[user]$ cd /usr/local/src
[user]$ rm -rf git-master
[user]$ git clone git://git.kernel.org/pub/scm/git/git.git git-master

# コンパイルします
[user]$ cd git-master
[user]$ make configure
[user]$ ./configure \
      >   --prefix=/usr/local \
      > 2>&1 | tee configure.log
[user]$ make 2>&1 | tee make.log

# rootユーザーでインストールします
[user]$ sudo env PATH=$PATH paco -p git make install 2>&1 | tee make_install.log

# インストールバージョンを確認します
[user]$ git --version
git version 2.4.4.409.g5b1d901
19行目
2015/06/24時点のバージョンです

Gitoliteのインストール

リポジトリやユーザーを一元管理するため Gitoliteを GitHubから取得してインストールします。
Gitoliteは CentOSサーバー内のユーザーを変えれば複数インストールできますので、プロジェクトごとにプロジェクト名でユーザーを作成し、

ssh://プロジェクト名@Gitサーバー/リポジトリ

でリポジトリにアクセスできるようにすることも可能です。
Gitoliteのインストール
# Gitoliteのユーザー gitprojectを作成します
# Gitリポジトリへのアクセスで使用するユーザーになります
[root]  groupadd git
[root]  useradd -g git -d /home/git/gitproject gitproject
[root]  mkdir -p /home/git/gitproject
[root]  chown gitproject.git /home/git/gitproject
[root]  chmod 770 /home/git
[root]  chmod 700 /home/git/gitproject

# Gitoliteの管理ユーザー gitadminを作成します
[root]  useradd -g git -d /home/git/gitadmin gitadmin -m

# gitadminユーザーで SSH接続用の鍵ペアを作成します
[root]  su - gitadmin

[gitadmin]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/git/gitadmin/.ssh/id_rsa): [Enter]
Created directory '/home/git/gitadmin/.ssh'.
Enter passphrase (empty for no passphrase): [Enter] (パスフレーズは設定しません)
Enter same passphrase again: [Enter]
     :

# 公開鍵を.sshから出して、gitprojectからアクセス可能にしておきます
[gitadmin]$ cp id_rsa.pub /home/git/gitadmin.pub
[gitadmin]$ chmod 660 /home/git/gitadmin.pub

[gitadmin]$ exit

# gitprojectユーザーになって Gitoliteを GitHubから取得します
[root]  su - gitproject

[gitproject]$ cd /tmp
[gitproject]$ git clone git://github.com/sitaramc/gitolite

# Gitoliteをインストールします
[gitproject]$ mkdir $HOME/bin
[gitproject]$ gitolite/install -to $HOME/bin
[gitproject]$ rm -rf gitolite

# 管理ユーザーgitadminの公開キーを使用してGitoliteのセットアップを行います
[gitproject]$ cd $HOME
[gitproject]$ mv /home/git/gitadmin.pub ./
[gitproject]$ bin/gitolite setup -pk gitadmin.pub
[gitproject]$ rm gitadmin.pub
[gitproject]$ exit

SSHの接続設定

追加した gitグループのユーザー gitprojectが SSH接続可能になるように SSHの AllowGroupsに gitグループを追加します。
SSHの接続設定
[root]  vi /etc/ssh/sshd_config
----------(vi ここから)----------
     :
# 空白に続けて gitグループを追加します
AllowGroups ...(略)... git
     :
----------(vi ここまで)----------

# 設定を反映させて再起動します
[root]  service sshd restart

Gitolite管理の準備

Gitoliteで管理されているリポジトリやユーザーの追加や削除、権限設定等は Gitoliteの管理ユーザー gitadminで Gitoliteの gitolite-adminリポジトリを操作することによって行います。
Gitoliteの管理ユーザー gitadminで gitの初期設定を行い、管理する Gitoliteユーザーの gitolite-adminリポジトリを git cloneで取得します。
Gitolite管理の準備
# gitadminユーザーでGitの設定を行います
[gitadmin]$ git config --global user.name      "Gitolite Administrator"
[gitadmin]$ git config --global user.email      gitadmin@localhost
[gitadmin]$ git config --global push.default    simple
[gitadmin]$ git config --global core.quotepath  false

# Gitoliteユーザー gitproject の gitolite-admin リポジトリを初回取得します
# 複数のGitoliteユーザー(プロジェクト)を管理することを考え、リポジトリ名をプロジェクト名にして取得しています
[gitadmin]$ git clone gitproject@localhost:gitolite-admin gitproject

クライアントユーザーの登録

Gitoliteへのクライアントユーザー登録は Gitoliteユーザーから gitolite-adminリポジトリを取得し、keydirディレクトリにクライアントユーザーの公開鍵を登録することにより行います。

PuTTY・鍵セットの作成OpenSSH・鍵セットの作成 を参照して、クライアントユーザーが各々鍵セットを作成します。
クライアントユーザーで鍵セットを作成できない場合は、クライアントユーザーからパスフレーズを受け取り、サーバー側で鍵の作成を代行することができます。
既に SSHの鍵セットを所有しているクライアントユーザーの場合は、新たに鍵セット作成する必要はなく、所有している鍵を使用しても構いません。

鍵セット作成の代行作成
# Gitoliteの管理ユーザー gitadmin で鍵セットを代行作成します
# 下記はクライアントユーザー projmemberの workpc用鍵セットを作成する例です

# クライアントユーザー projmember の公開鍵保存用に .sshpub ディレクトリを作成します
[gitadmin]$ mkdir .sshpub

# .sshpubディレクトリでクライアントユーザーの鍵セットを作成します
[gitadmin]$ cd .sshpub
[gitadmin]$ ssh-keygen -t rsa -C "projmember@workpc" -f projmember@workpc
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [クライアントユーザーから受け取ったパスフレーズ]
Enter same passphrase again: [パスフレーズ再入力]
     :

.sshpub内の鍵セット projmember@workpcprojmember@workpc.pub をクライアントユーザー projmemberに workpc用として渡します。
クライアントユーザー projmemberが受領した後に、秘密鍵 projmember@workpc .sshpubから削除します。

鍵セットを代行作成せず、クライアントユーザーから公開鍵 id_rsa.pub を渡された場合は、projmember@workpc.pubにファイル名を変更して .sshpub内に保管します。

gitprojectへのクライアントユーザー登録は、公開鍵 projmember@workpc.pub を Gitoliteに登録することにより行われます。

Gitoliteへのクライアントユーザー登録
# gitadminユーザーで Gitoliteユーザー gitproject から gitolite-adminリポジトリを取得します
# gitolite-adminリポジトリの初回取得でリポジトリ名を gitproject にしています
[gitadmin]$ cd gitproject
[gitadmin]$ git pull --rebase

# クライアントユーザー projmember@workpc.pub の公開鍵を gitolite-adminリポジトリに登録して push します
[gitadmin]$ cp ../.sshpub/projmember@workpc.pub keydir/
[gitadmin]$ git add keydir
[gitadmin]$ git commit -m "ユーザー登録:projmember"
[gitadmin]$ git push origin master

クライアントユーザー projmemberが複数のクライアントマシンを所持していて、それぞれのマシンごとに異なった SSH鍵セットで管理している場合は、gitolite-adminリポジトリの keydirディレクトリにそれぞれの公開鍵を下記のファイル名で登録します。

クライアントユーザー@マシン名.pub
※例
projmember@workpc.pub
projmember@laptop.pub
projmember@notepc.pub

コミットログのユーザー名はどのクライアントマシンから作業しても projmemberになります。

※参考 gitolite公式ドキュメント multiple keys per user

Gitoliteユーザーの .ssh/authorized_keysを表示することによりユーザーの登録を確認できます。

Gitoliteクライアントユーザーの登録確認
# Gitoliteユーザーgitprojectで.ssh/authorized_keysを表示します
[gitproject]$ cat .ssh/authorized_keys
# gitolite start
command="/home/git/gitproject/bin/gitolite-shell gitadmin" ...(略)... gitadmin@localhost
command="/home/git/gitproject/bin/gitolite-shell projmember" ...(略)... projmember@workpc
     :
# gitolite end

公開キーが存在すれば、Gitoliteユーザーに登録されています。
登録したクライアントユーザーのパソコンから Gitoliteのテスト用リポジトリを下記の URLで git cloneしてみます。

ssh://gitproject@Gitサーバー/testing

クライアントユーザーの削除

クライアントユーザーの削除は Gitoliteユーザーの gitolite-adminリポジトリを取得し、keydirディレクトリからクライアントユーザーの公開鍵を削除することにより行います。

下記はクライアントユーザー projmember@workpcを削除する例です。

Gitoliteクライアントユーザーの削除
# gitadminユーザーでGitoliteユーザー gitproject から gitolite-adminリポジトリを取得します
# gitolite-adminリポジトリの初回取得でリポジトリ名を gitproject にしています
[gitadmin]$ cd gitproject
[gitadmin]$ git pull --rebase

# クライアントユーザー projmember@workpc.pub の公開鍵をkeydirから削除して push します
[gitadmin]$ rm keydir/projmember@workpc.pub
[gitadmin]$ git add keydir
[gitadmin]$ git commit -m "ユーザー削除:projmember@workpc"
[gitadmin]$ git push origin master

Gitoliteユーザーの .ssh/authorized_keysを表示することによりユーザーの削除を確認できます。

Gitoliteクライアントユーザーの削除確認
# Gitoliteユーザーgitprojectで.ssh/authorized_keysを表示します
[gitproject]$ cat .ssh/authorized_keys
# gitolite start
command="/home/git/gitproject/bin/gitolite-shell gitadmin" ...(略)... gitadmin@localhost
     :
# gitolite end

公開キーが存在しなければ、Gitoliteユーザーから削除されています。

リポジトリの作成と権限設定

Gitoliteで管理するリポジトリの作成と権限設定は Gitoliteユーザーから gitolite-adminリポジトリを取得し、confディレクトリの gitolite.confを編集することにより行います。

下記はリポジトリ repos01を作成して権限設定を行う例です。

リポジトリの作成と権限設定
# gitadminユーザーでGitoliteユーザー gitproject から gitolite-adminリポジトリを取得します
# gitolite-adminリポジトリの初回取得でリポジトリ名を gitproject にしています
[gitadmin]$ cd gitproject
[gitadmin]$ git pull --rebase

# 定義ファイルを編集し、リポジトリの作成と権限設定を行います
[gitadmin]$ vi conf/gitolite.conf
----------(vi ここから)----------
     :
# (例)リポジトリ repos01 を作成し、それぞれのユーザーに下記の権限を付与します
#   管理ユーザー   projadmin  読み込み/書き込み/巻き戻し
#   一般ユーザー   projmember 読み込み/書き込み
#   テストユーザー projtester 読み込み

# Repository ... repos01
repo repos01
    R   =   projtester
    RW  =   projmember
    RW+ =   projadmin

# ----------------------------------------
# (例)複数の一般ユーザーに権限を付与します

# Repository ... repos01
repo repos01
    R   =   projtester
    RW  =   projmember1 projmember2
    RW+ =   projadmin

# ----------------------------------------
# (例)複数の一般ユーザーでグループを作成して権限を付与します

# Group ... projmembergroup
@projmembergroup = projmember1 projmember2

# Repository ... repos01
repo repos01
    R   =   projtester
    RW  =   @projmembergroup
    RW+ =   projadmin

# ----------------------------------------
# (例)repos01のブランチごとに権限を付与します
#   読み込み権限は全ブランチに付与されます
#   個別ブランチごとの読み込み権限は設定できません
#
#   管理ユーザー   projadmin   全ブランチの書き込み/巻き戻し
#   一般ユーザー   projmember1 全ブランチ 書き込み
#   一般ユーザー   projmember2 masterブランチのみ 書き込み
#   テストユーザー projtester  全ブランチの読み込み

# Repository ... repos01
repo repos01
    R          =   projtester
    RW         =   projmember1
    RW  master =   projmember2
    RW+        =   projadmin

     :
----------(vi ここまで)----------

# 定義ファイルを commit & push します
[gitadmin]$ git add conf
[gitadmin]$ git commit -m "リポジトリ登録:repos01"
[gitadmin]$ git push origin master

作成するリポジトリは、group/repos01のように階層化することもできます。

その他、拒否ルールを用いた高度な権限設定やファイル単位の権限設定については下記を参照してください。

※Git公式サイトのドキュメント Git サーバー - Gitolite

Gitoliteの管理リポジトリ gitolite-adminに特定のクライアントユーザーの書き込み権限(RW)を付与すれば、クライアントマシンでユーザーやリポジトリの管理ができるようになります。

リポジトリの削除

Gitoliteで管理しているリポジトリの削除は、Gitoliteユーザーから gitolite-adminリポジトリを取得し、confディレクトリの gitolite.confを編集します。
その後、Gitoliteユーザーの repositoriesディレクトリから対象のリポジトリディレクトリを削除します。

下記はリポジトリ repos01を削除する例です。

リポジトリの削除
# gitadminユーザーでGitoliteユーザー gitproject から gitolite-adminリポジトリを取得します
# gitolite-adminリポジトリの初回取得でリポジトリ名を gitproject にしています
[gitadmin]$ cd gitproject
[gitadmin]$ git pull --rebase

# 定義ファイルを編集し、リポジトリ定義を削除します
[gitadmin]$ vi conf/gitolite.conf
----------(vi ここから)----------
     :
repo repos01               <-- 削除
    R   =   projtester     <-- 削除
    RW  =   projmember     <-- 削除
    RW+ =   projadmin      <-- 削除

repo repos02
     :
----------(vi ここまで)----------

# 定義ファイルを commit & push します
[gitadmin]$ git add conf
[gitadmin]$ git commit -m "リポジトリ削除:repos01"
[gitadmin]$ git push origin master

# Gitoliteユーザー gitproject で repositoriesディレクトリから削除します
[gitproject]$ rm -rf repositories/repos01

フィードバック

記事の内容についてのご質問、ご指摘、その他ご意見等は下記にてお願いいたします。
System House ACT公式ブログ内記事 :
CentOS サーバー構築 バージョン管理システム Git

トラックバックまたはコメントにてお寄せください。