[Geek] Git and Gitweb

又是一篇無聊的阿宅文章,不是阿宅的人就直接跳過吧。

Git 是一個 SCM (Source Control Management),如同 [svn] 或是 [cvs] 一樣,對你的原始碼作管理控制。

SCM 最常被應用的場合,就是一個團隊要開發 project ,同時會有好幾個人對一份程式碼作修改,用 SCM 來作管理。當然不只是程式碼,說明文件或是各種檔案都可以用 SCM 控制。開 branch,作 merge 都會是 SCM 的基本功能。

然而 SCM 更大的好處便是提供「歷史的查詢」。你可以很輕易的找出「某年某月某天,哪個人做了甚麼更動」,甚至你改東西改壞了,老闆臨時要你調出一個月前還能正常工作的版本,也是一行指令就可以翻出來。

大學的時候我們作專題,[阿伯] 就給我們導入了 svn,那是我第一次接觸 SCM。工作後還碰了一段時間的 [monotone],到現在我們換成 git。

我根本就已經中了 git 的毒,現在就連在 local 改個東西,也要弄個 local repository,才敢放心惡搞。

Git 由鼎鼎大名的 Linus Torvalds (Linux kernel 的作者) 主導,也是現在 Linux kernel 所使用的版本控制系統。除了速度快的一大特色之外,Git 非常適合用在鄉民眾多的專案之中。開一個新的 branch 對 git 而言是再正常不過的事情。因為 Git 使用 diff,開新 branch 的成本非常低,很容易就做出 patch 送交給別人。

在 local 端要使用 git,鍵入”git init” 就產生一個 repository,不需要特地跑一個 daemon。想要打包、備份直接 tar 就行了。

配合使用 git 的工具好像也不少,可以配合 git-svn 來把 svn repository 當成 git 使用。
前幾天我才架起了我自己的 [gitweb],讓我可以隨時用 web 介面瀏覽自己的 code。這東西超好用,很輕鬆的就可以看見我在哪一次的 commit 做了甚麼更動,甚至可以翻閱那一次的 commit 之中整個 repository 是甚麼樣子。

如果有阿宅想要架個 git server,已經有一篇非常簡單的 step by step 教學:[Hosting Git Repositories]

我稍微說明一下他的概念,希望能給上一點幫助。

*安裝 git (廢話!)

用 apt 來裝的話,我猜應該是要裝 git-core

* 創建 git 帳號。

他使用 gitosis 來輔助你設定 git server。新增一個帳號叫 git,接著在git 的家目錄底下工作。

* 透過 ssh 連線。

他的網路動作都是透過 ssh 來工作,所以你需要提供一個 public key,並且加入 git 的 authorized_keys,讓人們可以直接 ssh 成 git user。

* 用 git 管理 git server

這點就很妙了。首先 gitosis 會先產生一個 git repository,這個 repository 的內容就是「關於你的 git server 的設定檔」。舉例來說,你想要新增一個 project,你先在自己的電腦將那個特別的 repository clone 下來。在裡面更動一些敘述:「我想要新增某某 project,他的成員有某某某」,接著再送回遠端,接著那位成員就可以在那個 project 上面工作了。

照理來說透過 ssh 會有一定程度的安全,但 gitosis 現在仍有一些明顯的缺點。因為用 ssh 認證的方式,每一個有 commit 權限的人都可以登入到該機器的 git 帳號。甚至要毀了整個 git server 也行。

要設定 git-web 也很簡單,他是用一個 perl cgi 來達成的。
我在這邊貼上我的一些設定檔,需要的人就拿去改吧。

在 /etc/apache2/sites-available 放一個 gitweb

    DocumentRoot /var/www/gitweb/

    ErrorLog /var/log/apache2/gitweb/error.log
    CustomLog /var/log/apache2/gitweb/access.log common

    SetEnv GITWEB_CONFIG /etc/gitweb.conf

    Alias /gitweb.css /var/www/gitweb/gitweb.css
    Alias /git-logo.png /var/www/gitweb/git-logo.png
    Alias /git-favicon.png /var/www/gitweb/git-favicon.png
    Alias /git /home/git/repositories
    ScriptAlias /gitweb /usr/lib/cgi-bin/gitweb.cgi

    <Directory ‘/var/www/gitweb/’>
    Options FollowSymLinks -SymLinksIfOwnerMatch Indexes +MultiViews
    Order allow,deny
    Allow from all
    AllowOverride None
    </Directory>

增加一個 symbolic link 在 /etc/apache2/sites-enable/gitweb,指到 ../sites-avaible/gitweb

修改 /etc/gitweb.conf

    # path to git projects ( .git)
    $projectroot = “/home/git/repositories”;

    # directory to use for temp files
    $git_temp = “/tmp”;

    # target of the home link on top of all pages
    $home_link = $my_uri;

    # html text to include at home page
    $home_text = “indextext.html”;

    # file with project list; by default, simply scan the projectroot dir.
    $projects_list = $projectroot;

    # stylesheet to use
    $stylesheet = “/gitweb.css”;

    # logo to use
    $logo = “/git-logo.png”;

    # the ‘favicon’
    $favicon = “/git-favicon.png”;

在 /var/www/gitweb 的目錄裡面
把 git-favicon.png, git-logo.png, gitweb.css 放進去。
ln -s /usr/lib/cgi-bin/ cgt-bin

把 gitweb.cgi 放到 /usr/lib/cgi-bin 之下。

3 Comments

  1. tick said,

    September 26, 2008 @ 10:56 am

    ps. git 帳號是可以設成 nologin 的 :-)

  2. Joseph Chang said,

    September 26, 2008 @ 4:08 pm

    (跳過)

  3. walkingice said,

    September 27, 2008 @ 3:11 am

    Tick: 沒試過把 git login 關掉XD,thanks

    Bizkit: 我記得有人跟我說過
    #BZ:說自己不宅會招來七年的core dump

RSS feed for comments on this post