http://blog.chinaunix.net/uid-11639156-id-3077471.html
svn作為一個優秀源碼版本的管理工具,可以適合絕大多數項目。但是因為它的采用中心化管理,不可避免的存在本地代碼的備份和版本管理問題。也就是說對於尚未或暫無法提交到Subversion服務器的本地代碼來說,存在着被誤刪除和版本更新無法回退兩大情形。
git作為一個分布式版本管理工具,可以很好的解決這個問題。因為它的大多數操作是在本地進行的。這里要說的是git是如何做到既可以管理好本地代碼又可以與已有的SVN中心庫進行同步的。
支持去中心化,是Git與生俱來的特性,它在本地保留了從中心服務器clone出來的源碼庫的全部信息,這樣,你在本地修改完代碼后便可以直接提交到本地 的代碼版本庫中。本地代碼的備份和版本管理的問題就這樣被Git輕而一舉的就解決了。而本地源碼庫與SVN中心源碼庫的同步操作則是由Git提供的 git-svn工具來完成的。
下面是一個git-svn的一般使用流程:
1、git-svn clone svn_repository
2、修改本地代碼,使用git add/commit將修改提交到本地git庫
3、定期使用git-svn rebase獲取中心svn repository的更新
4、使用git-svn dcommit命令將本地git庫的修改同步到中心svn庫
- 檢出一個已存在svn repository(類似於svn checkout)
可以通過git-svn clone命令完成這個操作: git-svn clone svn_repository_url
一般情況下git svn clone這個操作會從第一個版本開始同步,如果版本號已經到了好幾萬(或更高?),這個操作會相當的費時。這時可以使用參數-r$REVNUMBER:HEAD檢出指定版本后的代碼。
因此,更好的步驟應該是這樣:
svn info svn_repository_url, 記錄最后的版本號,假設是260
假設要檢出最后5個版本,做個簡單的減法: 260 – 5 = 255
開始clone操作了:git-svn clone -r255:HEAD 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中心版本庫的差異。
- 提交時的沖突解決:
如果你正在提交的文件在svn服務器上已經被別人改過,就會發生提交沖突。通常解決方法如下:
首先使用git-svn rebase獲取svn服務器上的最新沖突文件,比如:conflict.c,這將導致與本地conflict.c沖突,不過此時svn版本信息已經添加到本地git庫中(通過git log可以查看),git-svn rebase提示你在解決conflict.c的沖突后,運行git rebase –continue完成rebase操作
打開conflict.c,修改代碼,解決沖突
執行git rebase –continue,git提示:You must edit all merge conflicts and then mark them as resolved using git add
執行git add conflict.c,告知git已完成沖突解決
再次執行git rebase –continue,提示”Applying: git xxx”,此時”git xxx”版本又一次成功加入本地版本庫,可通過git log查看;
執行git-svn dcommit將conflict.c的改動同步到svn中心庫,到此算是完成一次沖突解決。