Pages

November 14, 2011

Gitit - git based wiki

最近又換了新的 wiki 系統來做個人筆記,雖然使用了 [pmwiki] 很長一段時間,遇上 [gitit] 之後我還是毅然決然地換過來。只因我發現原本希望 pmwiki + git 能夠做到的事情,在 gitit 上面更完整地做完了。

簡單來說 gitit 非常適合 git 狂熱份子

前些日子因為接案的需求,使用了不少 github 上面的 wiki。github 的 wiki 使用 markdown 的語法,甚至可以把整個 wiki clone 下來,在 local 端寫完東西之後直接 push 上去。這樣的使用情境非常符合我的需求,想說有沒有類似的 open source 工具,果不其然,用 haskell 寫成的 gitit 就擺在那裡。

gitit 有以下的特色是我特別重視的

  • 有搜尋功能,包括中文搜尋
  • 不要有 mysql 之類的 database
  • 不需要 Apache
  • 可以直接用 vim 等工具來編輯,紀錄東西就像寫文字檔一樣簡單
  • 使用 markdown 語法,寫完的文件能夠與其他工具接軌
  • 因此,網頁介面可以直接匯出 epub, odt...之類的檔案
  • 直接使用 git 管理 wiki 內容,寫程式習慣用 git 的人,寫起來毫無窒礙感
  • 由於使用 git 管理純文字檔,因此容易備份、重建


debian 系要安裝 gitit 非常簡單,一行指令就裝完了

$ sudo aptitude install gitit

啟動也非常簡單,只要開一個空目錄,在該目錄下執行指令

$ gitit

就會自動產生需要的檔案,並且啟動一個網頁伺服器。瀏覽器只要打開 http://localhost:5001 就可以存取了。在網頁介面上頭編寫內容之後,記下 comment 並儲存,檔案內容就會透過 git 紀錄在 wikidata 目錄底下。換句話說,只要備份 wikidata 這個目錄就不必擔心筆記會隨著硬碟損壞而消失。



gitit 有些預設的選項我不是很喜歡,譬如說
  • 預設要註冊一個帳號才能編輯 # 我是個人私用,理論上使用者只會有我一個人
  • 檔案上傳限制太小  # 所謂上傳檔案,就是把某個檔案加進 git 裡面
  • 預設版面我不喜歡  # 雖然我的螢幕不小,但我習慣 1024px 的寬度,太寬會讓文字排版變很醜
  • 我不喜歡原來的 logo
  • 預設的 html table 或是 code block 沒有特別的背景或是邊框

總而言之,我自己把我所需要的 config 打包了起來,大致看起來如下圖



使用方法也很簡單

# 產生一個目錄叫 wiki,取出我打包的東西之後在裡面產生一個 branch 叫 mynote
$ mkdir wiki && cd wiki
$ git clone git://github.com/walkingice/gitice.git wikidata
$ git --git-dir=`pwd`/wikidata/.git branch mynote
# 用來備份,別忘了在 myhost.net 上面產生一個 backup.git 的 git 目錄
$ git --git-dir=`pwd`/wikidata.git remote add myhost foo@myhost.net:~/path/to/backup.git
# 以後只要一行指令就可以備份了,放進 crontab 更是備份地神不知鬼不覺
$ git push myhost mynote:master
# 指定 config 檔來執行
$ gitit -f wikidata/gitit/config

必須注意的是,因為我更改了 config 檔,指定 static 與 templates 目錄位在 wikidata/gitit/ 底下,所以執行 gitit 的位置影響著 gitit 尋找 static templates 這兩個目錄。換言之,你要在 wikidata 這個目錄的上層目錄執行 gitit,才會正確找到這兩個目錄。

此外,gitit 還有 plugin 的功能,不過我不懂 haskell,就還沒有試過了。

你如果注意到有個 Category 的分類,其實它更像是 gmail 裡面的 label 功能,只要在某一個 page 的最上方加入

---
categories: Geek Tool
...

上方三個減號,下方三個點,中間補上 categories,這個 page 就會出現於 Geek 與 Tool 兩個分類之中。

Update:

用 Linux 系統的人,當然要把啟動的指令放在 rc 裡面,我在 /etc/init.d 底下新增了一個 launch-gitit
#!/bin/sh ### BEGIN INIT INFO # Provides: launch-gitit # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start gitit # Description: start gitit by walkingice ### END INIT INFO set -e GITIT=/path/to/your/gitit case "$1" in start) cd ${GITIT} su walkingice -c "gitit -f wikidata/gitit/config &" ;; stop) killall gitit ;; *) echo "Usage: $0 {start|stop}" >&2; exit 1 ;; esac exit 0 

我們就可以用指令啟動或停止 gitit
$ sudo /etc/init.d/lanch-gitit start $ sudo /etc/init.d/lanch-gitit start 

或著設定好,在系統啟動的時候就會自動執行
$ sudo insserv launch-git # Debian 6 之後不再使用 update-rc.d 


Update:

在意效能的人,打開 top 的時候可以看見 gitit 總是佔用的 1% 的 CPU resource,原因是 haskell 的 GC 反覆地在執行,個人使用的 wiki 由於修改量比較小,並不需要這麼頻繁的 GC 來消耗筆電電力。

對此,github 上面有一份說明,執行 gitit 的時候加入 runtime option 把 GC 關掉就好。很不幸地,至少 Debian 系已經把 runtime option 關掉了
gitit -f my.conf +RTS -I0 -RTS gitit: Most RTS options are disabled. Link with -rtsopts to enable them. 

查了一下文件,大體原因是打開 Runtime options 會在執行 CGI 的時候產生一些 security issue。因為我實在是受不了持續浪費 CPU/電力的事情,還是決定重編一次 gitit

準備編譯(Preparing)
$ mkdir /tmp/gitit; cd /tmp/gitit $ sudo apt-get build-dep gitit # 安裝需要的 dependency packages,這時應該會安裝超肥的 ghc $ sudo apt-get source gitit $ cd gitit-0.10.0.1 

加入 rtsopts (Adding link options)

平常透過 dpkg-buildflags 把編譯的選項動態加入,但是 gitit 的情況有點不一樣。它用 ghc 編譯,自帶一套編譯的邏輯,所以要先修改 gitit.cabal,找到 Executable gitit 的區塊把 -rtsopts 加入
Executable gitit .... ghc-options: -Wall -threaded -fno-warn-unused-do-bind -rtsopts 

開始編譯

$ dpkg-source --commit # commit your chages of gitit.cabal $ dpkg-buildpackages # build deb file $ sudo aptitude remove ghs # remove the HUUUUUGE ghc packages 

接著重新安裝編出來的 deb 檔就行了。另外要注意的是,因為版號大小不同,升級的時候會蓋掉我們自己編譯的版本,只要打開 aptitude 把 gitit 用「=」給鎖起來不讓它自動升級即可。當然手動升級的時候還是可以更新,不過又要重編一次了 :P

現在你的 gitit 可以用 +RTS -I0 - RTS 了,enjoy it

Update:

如果在 Debian 想要用 plugin,記得要安裝 libghc-gitit-dev

No comments: