letoh’s workshop

January 16, 2008

rename support

Filed under: git, mercurial, Note — letoh @ 2:21 pm

習慣版本控制後寫程式會大膽許多,反正比對修改之處很簡單,復原到特定版本也只是舉手之勞。不過這僅限於納入追蹤控管的內容。大部份的版本控制系統能控管的項目還是有限 (我沒用過商業版,不曉得有沒有比較厲害),例如目錄與更名 (rename) 的控管。

有時在開發初期隨手寫幾個測試用的程式,隨後越來越龐大後開始整理並組織現有的程式碼,先不管開發流程的好壞,應該很多人都有類似經驗。不過若是一開始有導入版本控管,接下來就是頭大的問題了。以 cvs 來說,檔案一改名字或改路徑 (整理到特定目錄),history 就會中斷,日後要 diff 也不容易。

後起之秀 svn 雖然可以記錄 snapshot,checkout 特定版本不會掉檔案,印象中一樣不會有 rename 的記錄,只能人眼觀察前後幾個 revision 的檔案變化,但總是比 cvs 方便多了。

Wikipedia 上有一張 比較表 ,其中就包含 rename 項目。我目前有在使用的 svn、hg 和 git 都有支援 rename,但只有 hg 和 git 的記錄上看得到 reanme 的資訊 (svn 很久沒用了,要再確認看看)。rename 時需要用內建指令才會加入記錄:(-n 為測試指令用,不會真的執行動作)

$ hg -v mv -n a.c b.c
copying a.c to b.c
removing a.c

或是

$ git mv -n a.c b.c
Checking rename of ‘a.c’ to ‘b.c’
Renaming a.c to b.c
Adding : b.c
Deleting : a.c

同時,在 hgk 或 gitk 中也看得到這些資訊。

更名以後如果要透過 diff 比對修改處,一般看到的是完全刪除 a.c,並加入新的 b.c,如果想追蹤實際內容變更,則需要加上一些選項:

$ hg diff -g -r REV

或是

$ git diff -M REV

除了命令列的方式,也可以在 hgk 或 gitk 中透過選單的方式來檢視這些變更。

svk 還沒機會試用,但光是看到在 debian 上安裝還得額外裝上 33 個 perl module…我還是先用 hg 和 git 吧。

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Blog at WordPress.com.