新トップページへ | Tip

gitを使ってみる

LstUpdate : 13/06/15

CentOS6.4にgitをインストールし、使ってみます。ユーザー管理には、gitoliteを使用することにします。

※ここではgit自体の使い方は説明しません。あくまでも、gitの環境構築がメインです

もくじ

  1. まえがき
  2. gitのインストール
  3. gitoliteのインストール&ユーザー追加
  4. リポジトリの作成とユーザーの追加
  5. 追加したユーザーでリポジトリをcloneして編集してみる


まえがき

gitはファイルのバージョン管理をするアプリです。
gitについて書かれた本の日本語訳が公開されている様子です。これを一通り読むほうが下手な本を1冊読むより時間の有効活用ができます。→ http://git-scm.com/book/ja

このまとめを作るにあたって、gitのサーバーにSSHを使用してアクセスすることとしています。
SSH接続に必要なOSユーザーは1人で良いです。SSHで使用するユーザーと、gitを操作するユーザーは別物です。

ユーザー管理のために、gitoliteを使用します。gitを使用するにあたって、必ずしも必要なものではなりませんが、gitを管理・運用して行く上で便利なので入れたほうがよいです。なので、ここではgitoliteを使用した説明をしています。

あと、SSHでつなぐ場合、規模が大きくなるとSSHの設定に注意したほうがよいかもしれません。最大接続数の設定(MaxStartups)とかかな・・・?(予測)


gitのインストール

以下のコマンドでgitをインストール可能。

yum install git-core -y

CentOS6.4で、13/5/5に上記コマンドでインストールされれたバージョンは1.7.1でした。
※インストールされたバージョンの確認方法は以下のコマンドで可能

[root@gittest git]# git --version
git version 1.7.1
[root@gittest git]#

最新版のgitがほしい場合は、ソースからコンパイルしてインストールする必要があります。しかし、それについては、ここでは取り扱いません。


gitoliteのインストール&ユーザー追加

gitoliteとは、git上のユーザー管理やアクセス制御をするための補助ツールです。
ちょっと不思議な使い方ですが、素直にgitoliteを使用したほうが面倒が無くて良いです。
gitoliteをインストールして、ユーザーの登録までやってみます。

gitoliteのインストール
初期化を行う
ユーザー管理を行う


gitoliteのインストール

gitoliteは、CentOS6.4の標準のリポジトリに有りません。なので、epelから持ってきます。
まずは、epelのリポジトリを登録を行います。

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm

epelのリポジトリを追加するrpmをダウンロードし、それをインストールします。「yum repolist」コマンドで、リポジトリが追加されていることがわかります。

続いて、gitoliteを以下のコマンドでインストールします。

yum install gitolite

インストールが終わったら、混乱を避けるため、epelのリポジトリを参照しないよう、設定ファイルの編集をします。
/etc/yum.repos.d/epel.repoファイルの中の、enabled=1となっている箇所をenabled=0に書き換えればOK。


初期化を行う

秘密鍵&公開鍵の生成、そしてgitの初期化を行います。

gitoliteをインストールすると、OSにgitoliteユーザーが追加されます。gitoliteユーザーになって作業します。
なお、このユーザーのホームディレクトリは「/var/lib/gitolite/」になる様子です。

まずは、gitoliteユーザーにsuします(gitoliteユーザーは、gitoliteをインストールしたら自動的に追加されます。)

[root@gittest gitkey]# su - gitolite
-sh-4.1$

次に、ssh-keygenコマンドを使用し、公開鍵・秘密鍵を作成します。
Enter file in which to save the keyと入力を求められ、公開鍵・秘密鍵のファイルを出力するパスを入力します。そのままエンターキーを押下すると、デフォルトの場所(ユーザーのホームディレクトリの中の.sshディレクトリ内)にファイルが生成されます。
Enter passphrase とパスフレーズの入力を求められたら、好きな文字列を入力します(パスワードみたいなものなので、必ず覚えておきます)。
エンターキーを押下すれば、ファイルが生成されます。

-sh-4.1$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/gitolite/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/gitolite/.ssh/id_rsa.
Your public key has been saved in /var/lib/gitolite/.ssh/id_rsa.pub.
The key fingerprint is:
〜以下省略〜

生成された、ファイルを分かりやすくするため、名前変更します。
公開鍵「id_rsa.pub」を「gitadmin.pub」に名前変更、秘密鍵「id_rsa」を「gitadmin」に名前変更したとして、話を進めます。

gitoliteユーザーに変更後、gitoliteの初期化を実行します。
「gl-setup <id_gitadmin_rsa.pubのあるパス>」を入力し、enterキーを押下すると以下のような表示になります(ここではid_gitadmin_rsa.pubは、/gitkey/id_gitadmin_rsa.pubにあるとする)。

-sh-4.1$ gl-setup ~/.ssh/gitadmin.pub
The default settings in the rc file (/var/lib/gitolite/.gitolite.rc) are fine for most
people but if you wish to make any changes, you can do so now.

hit enter...

言われた通り、enterキーを押下すると、viが自動的に起動して設定ファイルが開かれます。
ここで、編集しろYO!という意図なのでしょうが、後からでも編集できるのでここでは「:q!」とでも打ってviを終了させます。

creating gitolite-admin...
Initialized empty Git repository in /var/lib/gitolite/repositories/gitolite-admin.git/
creating testing...
Initialized empty Git repository in /var/lib/gitolite/repositories/testing.git/
[master (root-commit) 326bef4] gl-setup /var/lib/gitolite/.ssh/gitadmin.pub
 2 files changed, 8 insertions(+), 0 deletions(-)
 create mode 100644 conf/gitolite.conf
 create mode 100644 keydir/gitadmin.pub
-sh-4.1$

viを終了させると上記のようなメッセージが出力され、初期化が終了します。
初期化が完了すると、以下のようなファイルが追加されています。ここで、重要なのは「gitolite-admin.git」です。これはgitのリポジトリで、このリポジトリ内のファイルを編集することでユーザーの追加やアクセス権の設定を行います。

-sh-4.1$ pwd
/var/lib/gitolite
-sh-4.1$ ls
projects.list  repositories
-sh-4.1$ cd repositories/
-sh-4.1$ ls
gitolite-admin.git  testing.git
-sh-4.1$

ここで作成したrepositoriesディレクトリ内に、各プロジェクトのリポジトリを保管することとなります(そうしないと、gitoliteがgitのリポジトリを認識してくれないみたいです)。

の作業でリポジトリをcloneするので、その際に面倒が無いように、sshの設定ファイルを作成し秘密鍵を自動的に参照させるようにします。
gitoliteのホームディレクトリ(/var/lib/gitolite/)の中の.sshディレクトリに、「config」ファイルを新規に作成し、内容を以下のようにします。
IdentityFileで指定しているパスには、最初に作成した秘密鍵のパスを指定してください。

Host localhost
        IdentityFile ~/.ssh/gitadmin

そして、ここで作成したconfigファイルのパーミッションは、600に変更します。
この作業の結果、.sshディレクトリは以下のようにファイルが2個増えるはずです。

-sh-4.1$ pwd
/var/lib/gitolite/.ssh
-sh-4.1$ ls -l
合計 16
-rw-r-----. 1 gitolite gitolite  539  6月 15 17:06 2013 authorized_keys
-rw-------. 1 gitolite gitolite   52  6月 15 17:11 2013 config
-rw-------. 1 gitolite gitolite 1743  6月 15 16:56 2013 gitadmin
-rw-r--r--. 1 gitolite gitolite  399  6月 15 16:56 2013 gitadmin.pub
-rw-------. 1 gitolite gitolite    0  6月 15 17:06 2013 old_authkeys
-sh-4.1$


ユーザー管理を行う

さきほど初期化を行い生成されたリポジトリ「gitolite-admin.git」をcloneして、編集を行います。
「git clone ssh://gitolite@localhost/gitolite-admin.git」とすることで、カレントディレクトリに、gitolite-adminリポジトリがcloneされます(作業用のリポジトリコピーです)。

-sh-4.1$ git clone ssh://gitolite@localhost/gitolite-admin.git
Initialized empty Git repository in /var/lib/gitolite/clone/gitolite-admin/.git/
Enter passphrase for key '/var/lib/gitolite/.ssh/id_gitadmin_rsa':
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (6/6), 767 bytes, done.
remote: Total 6 (delta 0), reused 0 (delta 0)
-sh-4.1$

cloneしたファイルを修正し、commit(cloneしてきたリポジトリにソースをcommitする)して、push(clone元のリポジトリへファイルをcommitする)することで、設定を反映させることができます。

gitolite-admin.gitリポジトリのファイル構成は以下のようになっています。

-sh-4.1$ ls -R gitolite-admin/
gitolite-admin/:
conf  keydir

gitolite-admin/conf:
gitolite.conf

gitolite-admin/keydir:
id_gitadmin_rsa.pub
-sh-4.1$

gitolite-admin/conf/gitolite.confは設定ファイルです。
gitolite-admin/keydirディレクトリには、gitリポジトリにアクセスする各ユーザーの公開鍵を保管しておくディレクトリです。ファイル名は、「<開発ユーザ名>.pub」とします。

説明は以上です。
から、具体的にリポジトリを作成しそこにアクセスできるユーザーを設定してみます。


リポジトリの作成とユーザーの追加

コンソールから、リポジトリを作成し、そこにアクセスするユーザーの追加の作業をやってみます。
ここでは、リポジトリアクセスをするユーザー「alctail」を例にしています。OSのユーザーアカウントと、gitのアカウントは無関係ですが、Linuxでの作業の都合上、OSにalctailアカウントがあったほうが便利なので、OSにalctailユーザーを追加し、そのユーザーで作業することを前提で話を進めます。

SourceTreeなどのツールを使うことで、このあたりの面倒はかなり緩和されます。SourceTreeを使った例は、次で紹介します。

リポジトリの作成
リポジトリアクセスするユーザーの初期設定
リポジトリアクセスするユーザーの鍵作成
gitにアクセスするユーザーを追加する


リポジトリの作成

gitoliteユーザーに切り替え、この作業を行います。
/var/lib/gitolite/repositoriesへ移動し(このディレクトリでないと、gitoliteがリポジトリがあることが理解してくれない)、ディレクトリ(ここではtestRepとします)を作成し、そのディレクトリの中で以下のコマンドを実行します。
「git init」でリポジトリを作成します。

-sh-4.1$ pwd
/var/lib/gitolite/repositories
-sh-4.1$ mkdir sampleRep
-sh-4.1$ cd sampleRep/
-sh-4.1$ git init --bare --shared=true
Initialized empty shared Git repository in /var/lib/gitolite/repositories/sampleRep/
-sh-4.1$

これで/var/lib/gitolite/repositories/testRepにリポジトリが出来ました!
--bareオプションをつけることで、このリポジトリはベアリポジトリと呼ばれるものとなります。ソースファイルなどが追加されても、そのファイルはgitの内部形式で保管されるので、lsコマンドなどでリポジトリのディレクトリのファイル一覧を表示させても見えません。
gitを通してファイルのやりとりを行うので、gitサーバーのリポジトリはこの形式にすることが多いみたいです。


リポジトリアクセスするユーザーの初期設定

gitを使用するユーザーでログインし、一番最初にやるべきことは、ユーザー名とe-mailアドレスの設定らしい。
以下のコマンドにて登録する。

[alctail@gittest2 ~]$ git config --global user.name "alctail"
[alctail@gittest2 ~]$ git config --global user.email "alctail"
[alctail@gittest2 ~]$ git config --list
user.name=alctail
user.email=alctail
[alctail@gittest2 ~]$

最初の2行のコマンドを実行し、「git config --list」コマンドを実行すると、設定した情報が出力されます。
globalオプションをつけて設定した情報は、このシステム上の操作は上記コマンドで設定したユーザーで実行するようになります。リポジトリ毎に分けたい場合などは「--global」を外すと良いとのこと。ここでは、--globalをつけて実行したことを前提に話を進めます。

なお、上記設定は、実行ユーザーのホームディレクトリの中の「.gitconfig」というファイルに保存される様子です。

[root@gittest ~]# cat ~/.gitconfig
[user]
        name = alctail
        email = test@test.com
[root@gittest ~]#


リポジトリアクセスするユーザーの鍵作成

ssh-keygenを使用して公開鍵・秘密鍵を作成します。ssh-keygenの使い方はこちらにちらっと書いてあるので参考にしてください。

[alctail@gittest2 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/alctail/.ssh/id_rsa):
Created directory '/home/alctail/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alctail/.ssh/id_rsa.
Your public key has been saved in /home/alctail/.ssh/id_rsa.pub.
The key fingerprint is:
〜以下省略〜

ここで生成した、秘密鍵・公開鍵を使用してgitにアクセスします。
公開鍵は「id_rsa.pub」を「alctail.pub」に変更しておきます。この「alctail.pub」をユーザー登録の際、使用します。秘密鍵も「id_rsa」から「alctail」に変更しておきます。

gitアクセスする際、sshで接続するため、秘密鍵の設定をほどこしておきます。
ホームディレクトリの.sshディレクトリに「config」ファイルを作成し、以下の内容にして保存します。

Host localhost
        User alctail
        IdentityFile ~/.ssh/alctail

作業の結果~/.ssh/ディレクトリは以下のようになるはずです。

[alctail@gittest2 .ssh]$ pwd
/home/alctail/.ssh
[alctail@gittest2 .ssh]$ ls -l
合計 12
-rw-------. 1 alctail alctail 1743  6月 15 18:05 2013 alctail
-rw-r--r--. 1 alctail alctail  398  6月 15 18:05 2013 alctail.pub
-rw-------. 1 alctail alctail   51  6月 15 18:23 2013 config
[alctail@gittest2 .ssh]$

「alctail.pub」ファイルはユーザー登録の際、必要なので、gitoliteユーザーがアクセスできる適当な場所にコピーしておきます。


gitにアクセスするユーザーを追加する

gitoliteユーザーに切り替え、ユーザー登録作業を行います。
さきほど作成した「alctail.pub」を使用し、ユーザー登録を行います。

gitoliteでソースのcommitやpushを初めて行う場合は、以下のように、自分のユーザー名などを設定しておきます。

-sh-4.1$ git config --global user.name 'gitolite'
-sh-4.1$ git config --global user.email test@test.com
-sh-4.1$

gitoliteのcloneしたリポジトリの中に、keydirディレクトリがあります。このディレクトリが各ユーザーの公開鍵を保管しておく場所です。
なので、さっそく「alctail.pub」をkeydirディレクトリにコピーをします。

コピーするとkeydirディレクトリには2個ファイルが存在することになると思います。ちなみに「gitadmin.pub」はgitoliteの初期化をしたときに、指定した公開鍵ファイルです。ここにあるファイル名から後ろの「.pub」を消したものがユーザー名となります。

-sh-4.1$ pwd
/var/lib/gitolite/gitolite-admin/keydir
-sh-4.1$ ls -l
合計 8
-rw-r--r--. 1 gitolite gitolite 398  6月 15 18:29 2013 alctail.pub
-rw-rw-r--. 1 gitolite gitolite 399  6月 15 17:19 2013 gitadmin.pub
-sh-4.1$

次に、confディレクトリ(/var/lib/gitolite/gitolite-admin/conf)にあるgitolite.confファイルを編集します。
初期状態で、gitolite.confファイルは以下のようになっています。

repo    gitolite-admin
        RW+     =   gitadmin

repo    testing
        RW+     =   @all

これに対し、さきほど作成したリポジトリ「testRep」の設定を追加します。編集の結果、下に2行ほど追記を行いました。

repo    gitolite-admin
        RW+     =   gitadmin

repo    testing
        RW+     =   @all

repo    testRep
        RW      = alctail

repoでリポジトリを定義し(ここで指定するのは「/var/lib/gitolite/repositories」ディレクトリの中にあるディレクトリ名)、そのリポジトリに対するアクセス制御を記述していきます。
いろいろ書き方はあるみたいですが、今回はシンプルに「alctail」ユーザーが、リポジトリ「testRep」に対する読み書き権限を追加をしています。
alctailの後ろにスペースを空けて、ユーザー名を書き連ねることで、複数ユーザーを指定できます(「RW = alctail kyira kachua」と書き連ねていく)。

編集が終わったので、追加した「alctail.pub」と、変更を行った「gitolite.conf」のcommitとpushを行います。

-sh-4.1$ pwd
/var/lib/gitolite/gitolite-admin
-sh-4.1$ git add .
-sh-4.1$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   conf/gitolite.conf
#       new file:   keydir/alctail.pub
#
-sh-4.1$ git commit -m 'alctail user add'
[master a5be29b] alctail user add
 2 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 keydir/alctail.pub
-sh-4.1$

編集したファイル・追加したファイルのあるディレクトリよりも上のディレクトリに移動して、「git add .」とコマンドを実行しています。これで、編集・追加したファイルがcommit対象としてgitに認識させています。念のため「git status」コマンドでcommit対象のファイルの一覧を表示しています。
続いて、commitを実行しています。
次は、pushを行います。このpushを行うことで、初めて、今回追加した設定が有効になります。

-sh-4.1$ git push
Enter passphrase for key '/var/lib/gitolite/.ssh/gitadmin':
Counting objects: 10, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 794 bytes, done.
Total 6 (delta 1), reused 0 (delta 0)
remote: creating testRep...
remote: Initialized empty Git repository in /var/lib/gitolite/repositories/testRep.git/
To ssh://gitolite@localhost/gitolite-admin.git
   cfd5f48..a5be29b  master -> master
-sh-4.1$

「git push」を実行すると、鍵のパスフレーズを質問されるので、パスフレーズを入力してやります。これで、設定が有効になり、alctailユーザーはtestRepリポジトリにアクセス可能です!


ためしに追加したユーザーでリポジトリをcloneして編集してみる

testRepリポジトリをcloneします。

[alctail@gittest2 ~]$ git clone ssh://gitolite@localhost/testRep
Initialized empty Git repository in /home/alctail/testRep/.git/
Enter passphrase for key '/home/alctail/.ssh/alctail':
warning: You appear to have cloned an empty repository.
[alctail@gittest2 ~]$

プロジェクト名のディレクトリが生成され、その中に、リポジトリのファイルが格納されています。warningが出ていますが、testRepはまだ誰も使用していないので空の状態です。気にする必要はありません。

ファイルを1つ追加してみます。
testRepディレクトリの中にreadme.txtファイルを新規作成しました。

[alctail@gittest2 testRep]$ ls -l
合計 4
-rw-rw-r--. 1 alctail alctail 8  6月 15 20:08 2013 readme.txt
[alctail@gittest2 testRep]$

続いて、gitにcommit&pushを行います。

[alctail@gittest2 testRep]$ git add readme.txt
[alctail@gittest2 testRep]$ git commit -m 'readme.txt add'
[master (root-commit) eb8e855] readme.txt add
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 readme.txt
[alctail@gittest2 testRep]$ git push origin master
Enter passphrase for key '/home/alctail/.ssh/alctail':
Counting objects: 3, done.
Writing objects: 100% (3/3), 208 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://gitolite@localhost/testRep
 * [new branch]      master -> master
[alctail@gittest2 testRep]$

これで、リポジトリへファイルが追加されました。他の人がこのリポジトリをcloneすると、今追加した、readme.txtファイルを見ることができます。