對於軟件開發人員來講,版本控制系統他們再熟悉不過了,所謂版本控制系統就是軟件項目開發過程當中用於儲存開發人員所寫代碼全部修訂版本的軟件。它的主要目的是實現開發團隊並行開發、提升開發效率,對軟件開發進程中文件或目錄的發展過程提供有效的追蹤手段,保證在須要時可回到舊的版本,避免文件的丟失、修改的丟失和相互覆蓋,從而減輕開發人員的負擔,節省時間,同時下降人爲錯誤。而目前常見的版本控制系統分爲集中式版本控制系統和分佈式版本控制系統兩種。git
SVN和Git編程
在集中式版本控制系統中,目前比較經常使用的是SVN,而提及SVN就不能不談CVS,CVS是一個C/S系統,主要在開源軟件管理中使用。多個開發人員經過一箇中心版本控制系統來記錄文件版本,從而達到保證文件同步的目的。CVS版本控制系統是一種GNU軟件包,主要用於在多人開發環境下的源碼的維護。可是因爲CVS編碼存在一些問題,大多數軟件開發公司都使用SVN替代了CVS。SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,相較於RCS、CVS,它採用了分支管理系統,它的設計目標就是取代CVS。互聯網上不少版本控制服務已從CVS遷移到Subversion。說得簡單一點SVN就是用於多我的共同開發同一個項目,共用資源的目的。安全
而在分佈式版本控制系統中,Git逐漸佔據了上風,目前,國外最大的社交編程及代碼託管網站Github,Bitbucket,Gitlab,國內的碼雲、Coding、華爲軟件開發雲(DevCloud)中的配置管理等代碼託管平臺均支持Git。Git是一款免費、開源的分佈式版本控制系統,能夠有效、高速的處理從很小到很是大的項目版本管理。Git是Linus Torvalds爲了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。Torvalds 開始着手開發 Git 是爲了做爲一種過渡方案來替代 BitKeeper,後者以前一直是Linux內核開發人員在全球使用的主要源代碼工具。開放源碼社區中的有些人以爲BitKeeper 的許可證並不適合開放源碼社區的工做,所以Torvalds決定着手研究許可證更爲靈活的版本控制系統。儘管最初Git的開發是爲了輔助Linux內核開發的過程,可是咱們已經發如今不少其餘自由軟件項目中也使用了Git。服務器
而隨着擁有分佈式版本控制系統優點的Git的快速發展,愈來愈多的開發者準備從集中式版本控制系統SVN遷移到Git上,這其中,Git相對SVN表現出來的更有利於開發者版本控制管理的特色天然是最重要的緣由。架構
Git vs. SVN分佈式
由於從屬於不一樣的集中和分佈式模式,所以,從工做模式來看,Git和SVN存在着比較明顯的不一樣,以下圖所示。svn
集中式版本控制系統工做模型工具
分佈式版本控制模型測試
從二者的工做模式能夠看到,分佈式相比於集中式的最大區別在於開發者能夠提交代碼到本地,每一個開發者經過克隆(Git clone),在本地機器上拷貝一個完整的Git倉庫。而SVN則必須將代碼提交到中心控制器。而由此產生的差別性,則決定了Git和SVN的各自的特性。優化
安全性
首先在安全性方面,因爲採用分佈式系統,每一個用戶就至關於一個Git庫的備份,同時,經過SHA1哈希保證數據的完整性,防止惡意篡改,所以,具備很高的安全性。而SVN因爲採用集中式,所以,全部代碼版本庫均存儲在中央服務器中,所以,存在很大的單點故障的風險,同時,當服務器端歷史數據被篡改時,客戶端難以發現。
分支功能
在分支功能方面,因爲Git採用本質上指向Commit對象的可變指針,所以,便於查詢和追溯分支間的提交歷史,並可以支持雙向合併。而SVN分支不支持提交隔離,雖然一次提交可同時更改主線和分支的內容,但沒法查詢和追溯分支間的提交歷史。
發佈控制
在Git中,能夠設置只有發佈管理員纔有權限推送的版本庫或者分支,用於穩定發佈版本的維護,還能夠設置只有項目經理、模塊管理員纔有權推送的版本庫或者分支,用於整合測試,所以,發佈控制至關靈活,而SVN並無明確的發佈控制配置,更多的仍是依靠用戶本身的習慣。
開發審覈
在開發審覈方便,Git支持團隊成員自建分支和版本庫。經過合併請求或從成員我的版本庫、分支獲取提交,從提交說明、代碼規範等方面對提交逐一審覈。而SVN則不具有這些功能。
合併支持
Git基於DAG(有向非環圖)的設計比SVN的線性提交提供更好的合併追蹤,避免沒必要要的衝突,提升了工做效率。而Git基於對內容的追蹤而非對文件名追蹤,因此遇到一方或雙方對文件名更改時,可以很好進行自動合併或提供工具輔助合併。而SVN遇到一樣問題時會產生樹衝突,解決起來很麻煩。
所以,從以上的對比能夠看出,Git相對於SVN具備很多的優點,所以,從SVN遷移到Git成爲了衆多開發者的選擇。
從SVN到Git
那麼,從SVN到底如何切換到Git呢?實際上,方法有不少種,也都並非很複雜,其中,CSDN博主UrChen提供了一種切換的方法,只須要簡單的幾步,便可完成從SVN完美切換到Git。
1.使用git svn clone 拷貝SVN倉庫
cd ~/test_repo
git svn clone file:///home/*/Desktop/SVN/svn_repo/ -T trunk -b branches -t tags
2.新建一個Git的bare倉庫
cd ..
mkdir test.git
cd test.git
git init --bare
3.將Git的默認分支和SVN的默認分支trunk對應起來
git checkout trunk
4.將test_repo推送到test.git中
cd ~/test_repo
git remote add bare ~/test.git
git push bare
此時就完成了推送,能夠刪除test_repo了
5.將Git repo中的trunk重命名爲master
cd ~/test.git
git branch -m trunk master
6.將SVN repo中的tags移動到git repo的相應位置
使用git svn clone導出版本庫的時候會將svn中的tags保存成git中的tags/**,而並非默認的tag,因此要進行移動。(注意:此腳本僅示例tag是單級目錄的狀況,若是 tag 是包含目錄的兩級或者多級tag,請自行從新撰寫腳本)
cd ~/test.git
git for-each-ref --format=´%(refname)´ refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
7.完成遷移,獲得test.git
進入工做文件夾,執行
git clone ~/test.git
OK,大功告成,使用Git進行版本管理吧。
除此以外,還有幾個問題須要說明:
一、經過git-svn工具能夠在SVN遷移到Git上,保留倉庫歷史記錄。
二、切換到Git後推薦策略建議採用長期分支、特性分支。
三、目前Git還無法作到像SVN中對特定文件夾的細分權限控制,但可經過分倉或創建多分支的方式引導用戶使用。
四、切換到Git後遇到合併衝突時,分兩種狀況:
類型1:修改了同一個文件的同一行
解決方法:確認正確的修改,而後用命令行解決,示例以下:
類型2:文件被重命名爲不一樣的名字(樹衝突)
解決辦法:確認哪一個名字是正確的,刪除錯誤的,示例以下:
DevCloud與Git
前面已經說過,華爲軟件開發雲(DevCloud)中的配置管理服務全面支持Git,並對Git進行了全面優化。而實際上,這個配置管理服務就是面向軟件開發者提供的基於Git的在線代碼託管服務。對於管理員和項目經理,它提供了倉庫管理、權限管理、成員管理、分支保護、安全管控及統計服務,對於開發者,它則提供了代碼託管、代碼倉庫、在線客戶端等服務。配置管理服務的產品架構圖,以下圖所示:
DevCloud的配置管理服務對Git的優化主要體如今如下幾點:
1)支持跨地域協同開發、本地離線操做、代碼合入評審。
2)支持在線客戶端、代碼在線瀏覽、修改、提交、在線建立分支、比較分支、新建合併請求。
3)具備代碼加密傳輸、倉庫權限管理、分支保護等多種安全措施。
4)提供了大量的倉庫模板、通用模板,以方便開發者提升建立效率。
5)提供基於代碼的統計分析、倉庫提交信息統計、貢獻者統計等相關統計數據。
總結
總之,從SVN切換到Git目前來看,是利多弊少,也是一個趨勢,建議有條件的開發人員能夠嘗試一下,此外,DevCloud中的配置管理針對開發人員使用Git作了大量的優化工做,感興趣的朋友也能夠登陸http://www.hwclouds.com/devcloud/網站下載試用,體驗一把用優化了的Git進行版本控制的感覺!