CVS 與 Subversion 二三事
由 DIrk 發表于 2006-05-14 Sunday
網上大部分關于 CVS 和 Subversion 的文章一般都只是提到了 Subversion 相對于 CVS 的優點:版本化目錄,原子提交,徹底的版本歷史(文件/目錄的重命名),而對于一些更本質的概念性差別卻很少有人提到。
對于像我這樣使用 CVS 已經很多年、已經習慣了 CVS 操作的人來說,想要遷移到 Subversion,需要從概念和具體操作上進行如下轉變:
1、修訂版本號差別:在 CVS 中,修訂版本號是每個文件的,這是因為 CVS 使用 RCS 作為后端;每個文件都在版本庫有一個對應的 RCS 文件,版本庫幾乎就是根據目錄樹的結構創建。而在 Subversion 中,修訂版本號是針對整個目錄樹的,每個修訂號代表了一次提交后版本庫整個目錄樹的特定狀態,另一種理解是修訂號 N 代表版本庫已經經過了 N 次提交。當 Subversion 用戶討論“foo.c 的修訂號 5”的時候,他們的實際意思是“版本庫在修訂號 5 時包含的 foo.c”。
2、由此引起第二個重大差別:分支和標簽的不同處理方式。在 CVS 中,你可以通過給你的目錄樹(或者單個文件)建立分支或標簽以標記某個時刻的目錄樹狀態,但不管如何處理,從物理目錄上來說,始終是同樣的目錄結構,表面來說看不出差別。而 Subversion 則不同,其不區分文件系統空間和“分支”空間;分支和標簽都是普通的文件系統目錄,這恐怕是 CVS 用戶需要逾越的最大心理障礙。也就是說,如果你在 Subversion 下創建分支或者標簽,事實上是在額外的地方保存了一個版本庫目錄樹的快照(snapshot),事實上,按照 Subversion 文檔的說法,并不是目錄樹的完整復制,采用了更加高效的方法,類似 Unix 下的硬鏈接[hard link]。如果你訪問過采用 Subversion 的開源項目,你會發現這些版本庫都會建立類似 /trunk、/branches 和 /tags 等三個根目錄,然后版本庫主干分支位于 /trunk 目錄下,當你創建分支的時候,會將目錄樹快照保存到 /branches,同樣,標簽會保存到 /tags 中。
除了這兩點概念上的變動比較大之外,Subversion 在其他方面對 CVS 的兼容操作性還是很強的。
標簽:cvs,subversion
理解得不錯,再補充一點就是服務端沒有像cvs那樣完整的倉庫鏡像
而是只存儲了每次提交的變化內容
所以cvs checkout最新版要比較快
而svn查詢更新記錄則更快一些
第一點我已經慢慢習慣了,現在覺得svn這樣處理是理所當然的,第二點還是不習慣,以前就這個問題,還上過subversion的maillist,用半生不熟的中國英語發過郵件,居然還引來一個作者的多次回應,讓我再看看基本的概念。
由此看來,svn要比cvs占得空間大得多,不過綜合來看還是進步了不少,值得使用
其實并不是文件目錄的直接拷貝,手冊解釋說更加接近Unix下的soft link,理解上可能只是一個符號鏈接,并不真的重復存儲數據。