05 8月 2009

GIT + Apache2 on Ubuntu 8.10 (1)

前言
很早前就聽過GIT這個分散式的VCS,但是因為Subversion對我而言實在相當夠用,一直沒有想要更換的念頭,直到最近開始用了JRuby 才有了用用看的念頭,花了點時間確認GIT可以透過Apache走HTTP/HTTPS來checkin/checkout,而且Maven的SCM也支援GIT, 就開始了跟GIT奮戰的過程,我想至少花了4小時才確認這個GIT的Service是可用的。主要是因為不熟GIT的command,無法確認是否正 常。

安裝
(0)由於我已經有安裝了Apache2與Subversion,所以略過Apache2及DAV module的安裝,並且採用Subversion的帳號密碼檔

(1)安裝git-core curl

$>sudo apt-get install git-core curl

這時執行

$>git --version

應該會出現下到訊息,代表git應該可以用了
git version 1.5.6.3

再來是建立curl會用到帳密

$>touch ~/.netrc
然後在.netrc中加入下列資料

machine localhost
login youraccount #same with subversion
password yourpassword #same with subversion

(2)建立GIT repository

$>sudo mkdir /var/lib/git #先建一個git root,再將其他repository放在其下
$>sudo mkdir /var/lib/git/repo1
$>cd /var/lib/git/repo1
$>sudo git --bare init
$>sudo git-update-server-info
$>sudo chmod +x hooks/post-update #在透過http commit後會自動執行git-update-server-info
你會看到下列這樣的訊息,代表init成功
Initialized empty Git repository in /var/lib/git/repo1/
再設定權限,讓Apache2可以存取
$>sudo chown www-data:www-data -R /var/lib/git

(3)enable apache2 dav_fs, dav module
$>sudo a2enmod dav_fs
$>sudo a2enmod dav
因為我已經有裝Subversion,想說應該不用設定才是,後來發現只有起用dav這個module,而dav_fs沒起用,就是不行
所以還是記得要確認一下

(4)config git dav
建立Apache2用的GIT DAV設定
$>sudo touch /etc/apache2/mods-available/dav_git.conf
$>sudo ln -s /etc/apache2/mods-available/dav_git.conf /etc/apache2/mods-enabled/dav_git.conf
然後修改/etc/apache2/mods-available/dav_git.conf,將在第2個Step中加入的GIT Repository設為DAV,並指定
HTTP連結路徑為/git/repo1

Alias /git "/var/lib/git"
<Location /git/repo1>
	DAV on
	AuthType Basic
	AuthName "Git Repository"
	AuthUserFile "/etc/apache2/dav_svn.passwd"
	Require valid-user
</Location>

(5)restart apache2

$>sudo /etc/init.d/apache2 restart
這時再用Browser連結http://localhost:8080/git/repo1/HEAD,輸入帳密後應該可以看見下列訊息
ref: refs/heads/master

(6)clone repo1
在任一空目錄下執行git clone

$>git clone http://localhost/git/repo1
應該可以看到
Initialized empty Git repository in /yourpath/repo1/.git/
warning: You appear to have cloned an empty repository.

(7)test commit

$>touch readme
$>git add readme
$>git commit -m "first"
[master (root-commit) 29db40b] first
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme
$>git push origin master
Fetching remote heads...
refs/
refs/heads/
refs/tags/
updating 'refs/heads/master'
from 0000000000000000000000000000000000000000
to 29db40b949a69400ea4377c28703b6073c91d785
sending 3 objects
done
Updating remote server info

沒有留言: