歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 小試git-svn

小試git-svn

日期:2017/3/1 17:21:52   编辑:關於Linux

版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://bigwhite.blogbus.com/logs/100700290.html



部門一直使用Subversion作為源碼版本的管理工具。說實話,Subversion比較適合目前部門的絕大多數項目:沒有異地團隊開發,代碼中心化管理;基本上都在trunk上開發,較少使用分支,基本上沒有在各個branch間切換的成本。但對於我來說,有些情況下Subversion並不能滿足我的需求。

問題主要集中在本地代碼的備份和版本管理上。也就是說對於尚未或暫無法提交到Subversion服務器的本地代碼來說,存在著被誤刪除和版本更新無法回退兩大杯具情形。而對於這些情況,Subversion工具是無能為力的。

這時我們就需要借助其它工具來幫我們解決問題。Git就是這樣一款很給力的工具,它是一款分布式版本管理工具,由linux的締造者Linus Torvalds設計並實現,具體關於Git的介紹和使用方法可參見其官方站。這裡要說的是Git是如何做到既可以管理好本地代碼又可以與已有的SVN中心庫進行同步的。

支持去中心化,是Git與生俱來的特性,它在本地保留了從中心服務器clone出來的源碼庫的全部信息,這樣,你在本地修改完代碼後便可以直接提交到本地的代碼版本庫中。本地代碼的備份和版本管理的問題就這樣被Git輕而一舉的就解決了。而本地源碼庫與SVN中心源碼庫的同步操作則是由Git提供的git-svn工具來完成的。

git-svn默認包含在Git的安裝包中,不過在Ubuntu中,git-svn是作為一個獨立的Package需要額外安裝的(sudo apt-get install git-svn)。安裝後你就可以使用git svn xxx命令來操作中心SVN代碼庫了。當然如果你要使用與git svn等價的git-svn命令的話,你還需要將/usr/lib/git-core配置到你的PATH環境變量中,否則Shell會提示你無法找到git-svn這個命令。

* 檢出一個已存在svn repository(類似於svn checkout)
我們可以通過git-svn clone命令完成這個操作:git-svn clone your_svn_repository_url

* 從中心服務器的svn repository獲取最新更新
這個操作可以通過"git-svn rebase"完成。注意這裡用的是rebase,而不是update。update命令對於通過git-svn檢出的svn repostory的git版本庫是不可用的。

* 查看提交歷史日志
這個簡單,使用"git-svn log",加上-v選項,還可以提供每次commit操作涉及的相關文件的詳細信息。

* 將本地代碼同步到Svn服務器
完成這一操作需要通過"git-svn dcommit"命令。這個命令會將你在本地使用git commit提交到本地代碼庫的所有更改逐一提交到svn庫中。加上-n選項,則該命令不會真正執行commit到svn的操作,而是會顯示會有哪些本地變動將被commit到svn服務器。git-svn dcommit似乎不能單獨提交某個本地版本的修改,而是一次批量提交所有與svn中心版本庫的差異。

下面是一個git-svn的一般使用流程:
1、git-svn clone your_svn_repository;
2、修改本地代碼,使用git add/commit將修改提交到本地git庫;
3、定期使用git-svn rebase獲取中心svn repository的更新;
4、使用git-svn dcommit命令將本地git庫的修改同步到中心svn庫。

使用git-svn處理代碼沖突的步驟有些繁瑣,不過瑕不掩瑜吧。這裡用一個小例子來說明一下。

假設某svn中心庫上的某個項目foo中只有一個源碼文件foo.c:
* 我在使用git-svn clone檢出版本時,foo.c當時只有一個commit版本信息:"svn v1";
* clone出來後,我在本地git庫中修改foo.c,並通過git commit提交到本地git庫中,版本為"git v1";
* 不過與此同時另外一個同事也在修改foo.c這個文件,並已經將他的修改提交到了svn庫中,版本為"svn v2";
* 此時我使用git-svn dcommit嘗試提交我的改動,git-svn提示我:
Committing to svn://10.10.1.1:80/foo ...
M foo.c
事務過時: 過期: ”foo/foo.c“在事務“260-1” at /usr/lib/git-core/git-svn line 570
* 使用git-svn rebase獲取svn服務器上的最新foo.c,導致與foo.c沖突,不過此時svn版本信息已經添加到本地git庫中(通過git log可以查看),git-svn rebase提示你在解決foo.c的沖突後,運行git rebase --continue完成rebase操作;
* 打開foo.c,修改代碼,解決沖突;
* 執行git rebase --continue,git提示我:
You must edit all merge conflicts and then
mark them as resolved using git add
* 執行git add foo.c,告知git已完成沖突解決;
* 再次執行git rebase --continue,提示"Applying: git v1",此時"git v1"版本又一次成功加入本地版本庫,你可通過git log查看;
* 執行git-svn dcommit將foo.c的改動同步到svn中心庫,到此算是完成一次沖突解決。
Copyright © Linux教程網 All Rights Reserved