CVS,GIT,Mercurial和SVN比較

原文地址:http://www.cnblogs.com/greenmile/archive/2010/04/20/VCS.html

最近關於DVCS討論的如火如荼,轉一篇4個著名VCS的比較

特徵 CVS Git Mercurial Subversion
是否原子提交 CVS: 沒有. CVS提交不是原子的 Git: 是的. 提交都是原子的 Mercurial: 是的 Subversion: 提交都是原子的
文件和目錄是否可以移動或重命名 CVS: 不是. 重命名不支持. 如果手動進行, 可能會損壞歷史記錄 Git: 支持重命名, 這是很實用的目的. git甚至能檢測到重命名之後文件的改變. 儘管如此, 基於特殊的存儲結構, 重命名不會被顯示的記錄, git能夠推導出來(在實際使用中很容易做到) Mercurial: 是的, 重命名是支持的 Subversion: 是的. 支持重命名
在移動或重命名之後智能合併 CVS: 不能. 重命名都不支持, 就不必說智能了 Git: 不支持. 細節在Git FAQ裏: “Git有一個重命名的命令git mv, 但是這僅僅是爲了便利. 效果和移掉某個文件, 增加另外一個文件沒有任何區別” Mercurial: 是的. 重命名之後智能合併是支持的. Mercurtial文檔說:“如果我修改一個文件,而你重新命名了這個文件, 然後我們合併我們的變更, 那麼我所做的修改就會被更新到根據舊文件名字而產生的新文件裏(這可能就是你所期望的‘最簡單的動作’, 但是不是所有版本控制系統都支持) Subversion: 不支持. “svn help me“中提到“注意: 這個子命令相當於拷貝和刪除.“並且可能有個bug
文件和目錄拷貝 CVS: 不能. 拷貝不支持 Git: 不能. 拷貝不支持 Mercurtial: 是的. 支持拷貝 Subversion: 是的. 並且拷貝非常容易(O(1)). 包括產生分支
遠程存儲倉庫的備份 CVS: 間接的. 可以使用John Polstra寫的CVSup Git: 是的. 是git的內部特徵 Mercurial: 是的 Subversion: 間接的. 可以使用Chia-liang Kao的SVN::Mirror插件(好像是臺灣人)或Shlomi Fish的SVN-Pusher工具
是否傳遞變更到父倉庫 CVS: 不會 Git: 是的(Linux內核開發過程經常使用這個特徵) Mercurtial: 是的 Subversion: 是的, 使用要麼是Chia-Ling Kao的SVN::Mirror腳本或者Shlomi Fish的svn-push工具
倉庫權限 CVS: 很有限. “pre-commit hook scripts“能夠被用來實現各種權限控制系統 Git: 請看和Git一起附帶的contrib/hooks/update-paranoid. 看和svnperms類似的path_rules的代碼 Mercutial: 是的. 它能夠鎖住倉庫, 子目錄或者使用hooks後的文件 Subversion: 是的. 基於HTTP權限的WebDAV-based模塊能夠支持基於目錄級的倉庫
變更集 CVS: 不是. 變更是基於文件的 Git: 是的. 是支持的, 創建他們很容易 Mercurial: 是的. 變更集是支持的 Subversion: 部分支持. 對於一次提交會隱式創建一個變更集
跟蹤線性的文件歷史 CVS: 是的. cvs annotate Git: 是的.(git blame) Mercurial: 是的(hg annotate) Subversion: 是的(svn blame)
能夠只在倉庫的單目錄下作用 CVS: 是的 Git: 不是. 儘管如此, 提交多少能被限制, 請看“Repository Permissions” Mercurial: 能夠基於某樹的某個子集進行提交. 也有局部檢出的能力 Subversion: 是的
跟蹤未提交的變化 CVS: 是的. 通過cvs diff Git: 是的. 另外, 分支在git裏非常智能, 在某些工作流裏能夠被當成是另外一個未提交代碼的存儲庫. 請看“git stash“命令 Mercurial: 是的. 使用hg diff Subversion: 是的. 使用svn diff
基於單個文件的提交信息 CVS: 不是. 提交信息是基於單次變化的 Git: 是的. 提交信息基於變更集 Mercurial: 不是 Subversion: 不是. 沒有這個特徵
文檔 CVS: 非常棒. 有很多在線的tutorials和資源, 在線的書籍. 命令行客戶端也支持一個在線的幫助系統 Git: 良好. 短的幫助比較簡潔難懂. man頁很有分量, 但容易誤解. 有很多tutorial Mercurial: 很好. 有基於公司的書籍和wiki. 每個命令都集成了幫助 Subversion: 很好. 有一些在線的書籍和一些在線的tutorials和資源. 並且書籍是以docbook/xml寫的所以很容易變換成其他格式. 命令行同樣提供了在線的幫助系統
配置是否輕鬆 CVS: 好. 是個事實上的標準. 基於每個系統都有並且很容易配置 Git: 好. 在現有平臺上二進制可用. 需要C編譯器和Perl. 在windows上需要cygwin. 並有一些Unix特徵 Mercurial: 非常好. 幾乎所有平臺都有二進制包. 從源碼編譯需要python2.3以上, 並且需要C編譯器 Subversion: Subversion服務器需要安裝在apache2模塊裏(如果有人希望HTTP作爲底層協議的話)或使用它自身的服務器. 客戶端需要Subversion特徵的邏輯還有WebDAV庫(針對HTTP). 安裝組件很直接, 但是需要一些額外的工作(假定subversion在某些平臺沒有二進制包可用)
命令集 CVS: 包含了3個經常用到的命令的簡單的命令集(cvs commit, cvs update和cvs checkout)和其它一些 Git: 命令集很豐富, 並且和CVS不兼容 Mercurial: 嘗試模仿CVS交互方式, 但是偏離了基於不同的設計的意圖 Subversion: 類CVS的命令集, 能夠很容易被CVS用戶使用
網絡支持 CVS: 好. cvs在不同的場合使用不同的協議. 協議能夠通過ssh鏈接的加密隧道進行 Git: 非常棒. 能夠使用本地的git協議, 但也能在rsync, ssh, HTTP和HTTPS上使用 Mercurial: 非常棒. 使用HTTP或ssh. 遠程訪問會非常安全, 在只讀網絡裏不需要上鎖 Subversion: 非常好. Subversion服務器支持WebDAV+DeltaV(基於HTTP或HTTPS)作爲底層協議, 或者它自身的協議同樣能在ssh鏈接通道里使用.
可移植性 CVS: 好. 客戶端能在UNIX, Windows和Mac OS上使用. 服務器端能在UNIX, 附有UNIX模擬層的Windows上使用 Git: 客戶端運行在大多數的UNIX系統上, 但沒有MS-Windows本地程序. 基於cygwin的系統看起來也能使用 Mercurial: 非常棒. 運行在基於所有能運行python的平臺.倉庫是兼容性的基於CPU結構和字節序的 Subversion: 非常好. 客戶端和服務器端都能在UNIX, Windows和Mac OS X上運行
web接口 CVS: 是的.CVSweb, ViewVC, Chora和wwCVS Git: 是的. Gitweb包含在發佈包中 Mercurial: 是的. Web接口是內置組件 Subversion: 是的. ViewVC, SVN::Web, WebSVN, ViewSVN, mod_svn_view, Chora, Trac,SVN::RaWeb::Light,SVN Browser, Insurrection和perl_svn.另外, Subversion的apache服務也提供了一個基礎的web接口
圖形用戶界面 CVS: 非常好. 有很多圖形界面可以用: WinCVS, Cervisia(對於KDE), TortoiseCVS(Windows瀏覽器插件) Git: Gitk包含在發行版中. Qqit和Git-gui工具也可使用 Mercurial: 通過hgit擴展查看歷史; 檢入擴展(hgct)使得提交很容易. 一些第三方的IDEs和GUI工具(如eric3, meld)有一些集成的Mercurial支持 Subversion: 非常好. 有很多GUIs可用: RapidSVN(跨平臺), TortoiseSVN(Windows瀏覽器插件), Jsvn(java), 等. 大多數都還在開發中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章