2013年1月5日土曜日

git との格闘w その1 git サーバー on CentOS 6

気楽に Twitter4J の JavaDoc のリンク切れをドヤ顔で指摘したら、pull request してくださいとの返答をいただき、これまた気軽にりょうかいしたところ、やったことない人には壮絶に敷居が高そうなことがわかりましたw 自宅で1人で書いてるコードの変更管理なら CVS やら SVN やらで十分だし、仕事では某社のツールべったりだったし、目にはしたけど使ったことないんですよね、git。なのでもちろん github も見るだけでして。ここで諦めてもいいんですが、せっかくなので挑戦してみますか。まずは git から。

インストール

ふむふむ。git はコマンドラインでいろいろやるっぽいですね。もちろん IDE からもできるはずですがコマンドの理解から入るほうが理解しやすいですし。最終的にはせっかく買ったこの子から使いますよ。で、コマンドライン環境は・・・そんな時のために Linux サーバーがあるんですよ! ええ!早速インストールです。
# yum install git
(snip)
Setting up Install Process
Package git-1.7.1-2.el6_0.1.x86_64 already installed and latest version
Nothing to do
既に入ってましたw

使ってみる

まあ何はともあれ使ってみよう。まずはこのへんを読んでみる。ポイントは分散開発環境では当然問題になる部分ですが”cheap branching and easy merging”という部分にありそうですね。

まずは全体の環境設定から。
$ git config --global user.name "Sdk0815"
$ git config --global user.email "***@***.***"
何かリポジトリを作ってみます。
$ mkdir -p git/sample
$ cd git/sample
$ git init
Initialized empty Git repository in ~/git/sample/.git/
適当にファイルを置いて
$ git add .
$ git log
fatal: bad default revision 'HEAD'
$ git commit -m "initial commit"
[master (root-commit) 253133b] initial commit
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 README
 create mode 100644 tmp/README
$ git log
commit 253133b619739070a06835181c4ed6c40aa7e08c
Author: Sdk0815 <***@***.***>
Date:   Fri Jan 4 13:55:45 2013 +0900

    initial commit
ふむ。何かコミットできたようです。

・・・というか、ここから先はサーバーとやりとりするようになってる。せっかくだから自宅サーバーも git のサーバーとして使えるようにしてみるか?

サーバー構築

今度は
# yum install git-daemon
(snip)
Running Transaction
  Installing : 2:xinetd-2.3.14-35.el6_3.x86_64         1/2 
  Installing : git-daemon-1.7.1-2.el6_0.1.x86_64       2/2 
  Verifying  : git-daemon-1.7.1-2.el6_0.1.x86_64       1/2 
  Verifying  : 2:xinetd-2.3.14-35.el6_3.x86_64         2/2 

Installed:
  git-daemon.x86_64 0:1.7.1-2.el6_0.1
Dependency Installed:
  xinetd.x86_64 2:2.3.14-35.el6_3

Complete!
入ってませんでしたのでめでたくインストールw /etc/xinetd.d/git を開き、disable = yes を no に変更し、xinitd を restart。

ん、これだけ?よくわからんのでとりあえずリポジトリを作って進んでみよう。ユーザーも特に作られてないし・・・。
# cd /var/lib/git/
# mkdir sample
# cd sample
# git init --bare --shared
さっきのプロンプトに戻って
$ git remote add origin git://localhost/sample
$ git push origin master
fatal: The remote end hung up unexpectedly
ですよね・・・。そううまくいくわけはなく。/var/log/messages を見ると
git-daemon[25672]: 'receive-pack': service not enabled for '/var/lib/git/sample'
なるほど。さっきの /etc/xinetd.d/git の server_args に --enable=receive-pack を追加して xinetd を再起動してみる。
$ git push origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 333 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
error: unpack failed: unpack-objects abnormal exit
To git://localhost/sample
 ! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'git://localhost/sample'
めげるな!またログを見ろ!
git-daemon[25747]: error: insufficient permission for adding an object to repository database ./objects
ふむ。さっきの /var/lib/git/sample には objects ってディレクトリがあってそこは root の持ち物になってる。xinetd は root だが・・・ってそうか!また /etc/xinitd.d/git に戻り、ユーザーをチェックすると、nobody になってる。なるほど、では git ユーザーを作って再挑戦。ついでに repository のディレクトリも ~git/repo に変更。xinitd を再起動していざ。
$ git push origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 333 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
To git://localhost/sample
 * [new branch]      master -> master
おおお?うまくいったかな?確認。
$ cd ..
$ ls
sample
$ rm -rf sample
$ ls
$ git clone git://localhost/sample
Initialized empty Git repository in ~/git/sample/.git/
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (5/5), done.
$ ls
sample
$ cat sample/README 
This is test file.

おおお、できましたね!

0 件のコメント:

コメントを投稿