Git サーバーを Slackware 14.0 で動かそう!

さて、もたもたしているうちに Slackware 14.0 が出てしまいました!光陰矢の如し、歳月人を待たず、というやつです。

とまれかくまれ早速 Slackware 14.0 をインストールしてみました。どこが変わったのか分かりませんが、きっと良くなってるんでしょう!インストール方法は 13.37 と同じでした。これからインストールにチャレンジする人は以前書いた記事が参考になるかもしれません:第1回 Slackware でサイキョーの自宅サーバーを作ろう!

で、Git です。Git はサーバーマシンのコンフィグファイルとかの管理に使ったことがあります。つまり、ローカルでのみ使用したことがあります。みんなの PC から同じ Git レポジトリにコミットしてみよう!みたいな使い方はしたことはありません。使用方法としては後者の方がメジャーでしょうか。ともあれ Git サーバーの作り方を調べてみました。

まず、Git の基本です。Git はサーバーがなくても動きます。例えば、自分の Mac で以下のようなことができます:

レポジトリの初期化

[~]
me-> mkdir my_project
[~]
me-> cd my_project/
[~/my_project]
me-> git init  # my_project ディレクトリの中身を git でバージョン管理します
Initialized empty Git repository in /Users/me/my_project/.git/

レポジトリにファイルを追加する

[~/my_project]
me-> vim test.c  # 適当な内容でファイルを作ります
me-> git add test.c   # test.c をレポジトリに加えます

レポジトリに変更をコミットする

[~/my_project]
me-> git commit -m initial\ commit test.c
[master (root-commit) dc5ab14] initial commit
 1 file changed, 8 insertions(+)
 create mode 100644 test.c

上の例ではレポジトリをローカルに作成しました。これをどこかのサーバーに作成して、複数人で共有できるようにしましょう。

では、インストールしたての Slackware 14.0 マシンに SSH でログインします(開発環境のパッケージがインストールしてある前提です):

git アカウントの作成とパスワードの設定

me@slackware14:~$ sudo /usr/sbin/useradd -d /opt/git -m git
me@slackware14:~$ sudo passwd git

レポジトリの作成

me@slackware14:~$ cd /opt/git/
me@slackware14:/opt/git$ sudo -u git mkdir my_project.git
me@slackware14:/opt/git$ sudo -u git git init --bare --share my_project.git/
Initialized empty shared Git repository in /opt/git/my_project.git/

これで my_project というレポジトリが作成されました。手元の Mac から先ほど作ったレポジトリを Git サーバー (Slackware マシン) にプッシュしてみましょう。

レポジトリ(ブランチ)のプッシュ

[~/my_project]
me-> git remote add origin git@192.168.56.4:/opt/git/my_project.git
# 192.168.56.4 は slackware マシンの IP アドレスです
[~/my_project]
me-> git push origin master
git@192.168.56.4's password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 292 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.56.4:/opt/git/my_project.git
 * [new branch]      master -> master

よく調べてないのでアレなんですが、origin がサーバーの名前、master はブランチの名前、だと思います…。今どのブランチを操作してるのかは、 git branch -l で確認できます:

[~/my_project]
me-> git branch -l
* master

今度は、別の PC (CentOS マシン) にレポジトリをクローンしてみましょう。

レポジトリのクローニング

[me@centos ~]$ git clone git@192.168.56.4:/opt/git/my_project.git
Initialized empty Git repository in /home/me/my_project/.git/
git@192.168.56.4's password:
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

ついでに、この CentOS マシンで新しいファイルを作成して、レポジトリに追加してみましょう:

[me@centos ~]$ cd my_project/
[me@centos my_project]$ echo 'やあ、僕はビッキーだよ!ハハッ!' > greet.txt
[me@centos my_project]$ git add greet.txt
[me@centos my_project]$ git commit -m adding\ greet.txt greet.txt
[master f0efa7e] adding greet.txt
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 greet.txt
[me@centos my_project]$ git push origin master
git@192.168.56.4's password:
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 316 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.56.4:/opt/git/my_project.git
   dc5ab14..f0efa7e  master -> master

Mac のローカルレポジトリに変更を反映してみましょう。

レポジトリ(ブランチ)のプル

[~/my_project]
me-> git pull origin master
git@192.168.56.4's password:
From 192.168.56.4:/opt/git/my_project
 * branch            master     -> FETCH_HEAD
Updating dc5ab14..f0efa7e
Fast-forward
 greet.txt |    1 +
 1 file changed, 1 insertion(+)
 create mode 100644 greet.txt

いやあ、実に簡単ですね!毎回 ssh のパスワードを入力するのは手間なので、/opt/git/.ssh/authorized_keys にクライアント PC の公開鍵を書き込んでおけば完璧です。

また、ssh より効率的な git プロトコルなんていうのもあります。

Git プロトコルを使用する

まず、レポジトリを Gti デーモンで公開していいよ、ということを Git に知らせるためのファイルを作成します

me@slackware14:/opt/git$ sudo -u git touch my_project.git/git-daemon-export-ok

Git デーモンを起動する

me@slackware14:/opt/git$ sudo -u git git daemon --reuseaddr --base-path=/opt/git /opt/git

Git プロトコルでやり取りする

サーバーのアドレスに git:// というスキーマを付けると、git プロトコルで通信します:

[me@centos ~]$ git clone git://192.168.56.4/my_project.git
Initialized empty Git repository in /home/me/my_project/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (6/6), 575 bytes, done.
remote: Total 6 (delta 0), reused 0 (delta 0)

gitweb を使う

gitweb.cgi という CGI を使うと、レポジトリの内容を Web ブラウザで見ることができます。

me@slackware14:/opt/git/my_project.git$ sudo -u git git update-server-info

Aapche の設定

--- /etc/httpd/httpd.conf.orig  2012-10-01 14:05:21.093725611 +0900
+++ /etc/httpd/httpd.conf       2012-10-01 14:57:04.185592882 +0900
@@ -126,8 +126,8 @@
 LoadModule proxy_connect_module lib/httpd/modules/mod_proxy_connect.so
 LoadModule proxy_ftp_module lib/httpd/modules/mod_proxy_ftp.so
 LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
-LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so
-LoadModule proxy_scgi_module lib/httpd/modules/mod_proxy_scgi.so
+#LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so
+#LoadModule proxy_scgi_module lib/httpd/modules/mod_proxy_scgi.so
 #LoadModule proxy_fdpass_module lib/httpd/modules/mod_proxy_fdpass.so
 LoadModule proxy_ajp_module lib/httpd/modules/mod_proxy_ajp.so
 #LoadModule proxy_balancer_module lib/httpd/modules/mod_proxy_balancer.so
@@ -153,7 +153,7 @@
 #LoadModule asis_module lib/httpd/modules/mod_asis.so
 #LoadModule info_module lib/httpd/modules/mod_info.so
 #LoadModule cgid_module lib/httpd/modules/mod_cgid.so
-#LoadModule cgi_module lib/httpd/modules/mod_cgi.so
+LoadModule cgi_module lib/httpd/modules/mod_cgi.so
 #LoadModule dav_fs_module lib/httpd/modules/mod_dav_fs.so
 #LoadModule dav_lock_module lib/httpd/modules/mod_dav_lock.so
 #LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so
@@ -214,7 +214,7 @@
 #
 <Directory />
     AllowOverride none
-    Require all denied
+    #Require all denied
 </Directory>

 #
@@ -346,7 +346,7 @@
     # client.  The same rules about trailing "/" apply to ScriptAlias
     # directives as to Alias.
     #
-    ScriptAlias /cgi-bin/ "/srv/httpd/cgi-bin/"
+    #ScriptAlias /cgi-bin/ "/srv/httpd/cgi-bin/"

 </IfModule>

@@ -401,7 +401,7 @@
     # To use CGI scripts outside of ScriptAliased directories:
     # (You will also need to add "ExecCGI" to the "Options" directive.)
     #
-    #AddHandler cgi-script .cgi
+    AddHandler cgi-script .cgi

     # For type maps (negotiated resources):
     #AddHandler type-map var
@@ -525,3 +525,18 @@
 #
 #LoadModule dav_svn_module lib/httpd/modules/mod_dav_svn.so
 #LoadModule authz_svn_module lib/httpd/modules/mod_authz_svn.so
+
+<VirtualHost *:80>
+    ServerName gitserver
+    DocumentRoot /usr/share/gitweb
+    Alias /git /opt/git
+    <Directory /usr/share/gitweb>
+        Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
+        AllowOverride All
+        order allow,deny
+        Allow from all
+        AddHandler cgi-script cgi
+        DirectoryIndex gitweb.cgi
+    </Directory>
+</VirtualHost>
+

gitweb.cgi の設定

--- /usr/share/gitweb/gitweb.cgi.orig   2012-10-01 14:23:47.980676354 +0900
+++ /usr/share/gitweb/gitweb.cgi        2012-10-01 14:01:44.679734871 +0900
@@ -76,7 +76,8 @@

 # absolute fs-path which will be prepended to the project path
 #our $projectroot = "/pub/scm";
-our $projectroot = "/pub/git";
+#our $projectroot = "/pub/git";
+our $projectroot = "/opt/git";

 # fs traversing limit for getting project list
 # the number is relative to the projectroot

Apache を起動して (sudo /etc/rc.d/rc.httpd start) Web ブラウザで http://192.168.56.4 にアクセスすると、下のようなプリティーなサイトが見られます:

また、http でレポジトリをクローンすることもできます:

[me@centos ~]$ git clone http://192.168.56.4/git/my_project.git
Initialized empty Git repository in /home/me/my_project/.git/

要は ssh でアクセスできれば OK、という非常にシンプルな仕組みです。なお、複雑なアクセス制御には gitosis, gitolite といったツールを使うそうですが、まだ試してません。

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中