Friday, September 24, 2010

Git Update Master

As a git user, I used to work under feature branches, make changes and commit back to master at once. However sometime the master changes a lot and you have to pull changes from remote in master branch. Here's what I do to ease the messy branch switching...


#!/bin/sh
current_branch=`git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
git checkout master
git pull
git checkout $current_branch

Sunday, September 12, 2010

Autojump: Super-fast Directory Jump in Linux

這套小工具已經用了好久了,不得不說這實在太強大,尤其是我們source code的階層一多,一直要cd來cd去的,又跳上又跳下,有時候只是做件小事情,但光是要去那個目錄就要花好久...這個時候就要靠autojump來拯救世界了!!

Autojump: a cd command that learns
http://github.com/joelthelion/autojump/wiki


安裝方法很簡單,就像他wiki上說的,直接git clone下來之後執行install,然後記得要source他的profile就結束了。接下來他會記錄你每次cd到的地方,並偷偷的統計你常用的目錄。然後接著你就可以直接執行"j xxx"就會跳到那個目錄去...聽起來很神奇,這邊還是用個實際的例子示範一下:

假設我們目錄結構長這樣:


~/doc/pdf/
~/workspace/projects/efg/doc/
~/workspace/projects/abc/build
~/workspace/projects/cde/build


當你上面這些目錄都visit過(cd進去過)之後,autojump就會開始學習你這些常用的目錄,接著你只要打


$ j pdf


就會跳到~/doc/pdf,更神奇的是你還不用打全名,只要打開頭的字就好了,像是:


$ j p


就會跟上面的效果一樣,跳到~/doc/pdf。同樣的我們可以打這個目錄中任何一個子字串,像是我可以執行:


$ j efg


就會跳到~/workspace/projects/efg/下了。好了,雖然這樣很方便,但是如果有重覆的名字怎麼辦? 像是這邊我們有


~/workspace/projects/abc/build
~/workspace/projects/cde/build


這兩個目錄,他們都有build,如果我執行j build,那他會跳到那一個呢? 他實際上會跳到"比較常用"的那個,但是你如果想要有個選擇,只要打j build之後按tab,他就會出現數字讓你選擇...(這個很難用講的,實際上大家自己試試看就知道了)

總之,這個簡直就是Linux Shell狂人必裝!! 保證上手之後能節省你超多cd的時間啊!!

Saturday, September 11, 2010

HFS Alternative on Linux

很久以前在用Windows的時候,有一個小程式叫HFS (HTTP File Server)蠻好用的,可以馬上開一個小小的web server來share某一個檔案/目錄。後來換到Linux上之後比較少有這種需求,大部份都是開FTP Server or NFS就行了,不過總是覺得蠻麻煩的;剛剛稍微研究了一下,發現只要靠python就全搞定了XD...

在.bashrc裡加一行:

alias webshare='python -c "import SimpleHTTPServer; SimpleHTTPServer.test();"'


然後隨便在任何目錄下只要打webshare,就可以馬上把那個目錄分享出去啦!!

而另外一端要抓東西就可以透過browser或是直接wget...舉個例子來說,假設我要把整個目錄拷貝過去:

wget -r -nH --restrict-file-names=nocontrol [url]


這邊的-nH是要wget不要再建立"IP:PORT"的目錄,而--restrict-file-names=nocontrol則是為了確保兩邊filename encoding相同(如果都是Ubuntu就可以,一邊Ubuntu一邊Windows應該會出事.因為兩邊檔案系統的filename encoding應該不一樣)

那如果要像flashget那樣同時有多個session同時下載怎麼辦? 基本上wget沒辦法做到同一個檔案多個http session下載;但是如果是很多檔案在一個目錄下,倒是有人提出了一個work-around

wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &


這邊的-N是重點,簡單說就是wget會比較是否檔案已經存在在檔案系統上,如果是的話就跳過他;所以這樣一來這四個wget的instance就會某種程度上"合作"下載所有的檔案...