gitを使ってみる
LstUpdate : 13/06/15
CentOS6.4にgitをインストールし、使ってみます。ユーザー管理には、gitoliteを使用することにします。
※ここではgit自体の使い方は説明しません。あくまでも、gitの環境構築がメインです
もくじ
gitはファイルのバージョン管理をするアプリです。
gitについて書かれた本の日本語訳が公開されている様子です。これを一通り読むほうが下手な本を1冊読むより時間の有効活用ができます。→ http://git-scm.com/book/ja
このまとめを作るにあたって、gitのサーバーにSSHを使用してアクセスすることとしています。
SSH接続に必要なOSユーザーは1人で良いです。SSHで使用するユーザーと、gitを操作するユーザーは別物です。
ユーザー管理のために、gitoliteを使用します。gitを使用するにあたって、必ずしも必要なものではなりませんが、gitを管理・運用して行く上で便利なので入れたほうがよいです。なので、ここではgitoliteを使用した説明をしています。
あと、SSHでつなぐ場合、規模が大きくなるとSSHの設定に注意したほうがよいかもしれません。最大接続数の設定(MaxStartups)とかかな・・・?(予測)
以下のコマンドで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とは、git上のユーザー管理やアクセス制御をするための補助ツールです。
ちょっと不思議な使い方ですが、素直に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ユーザーがアクセスできる適当な場所にコピーしておきます。
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リポジトリにアクセス可能です!
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ファイルを見ることができます。