原文地址: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), 等. 大多數都還在開發中 |