使用Git 作為 Subversion 倉庫的客戶端

來自我的CSDN博客:https://blog.csdn.net/dahaohan/article/details/83545403

Git 與 Subversion

Git 和 Subversion兩個大名鼎鼎的版本控制系統(tǒng),有著各自的特點和長處。筆者更喜歡Git分布式去中心化不依賴網(wǎng)絡(luò)的便捷和強(qiáng)大的本地分支管理,目前開源項目以及大量的商業(yè)項目都使用 Subversion 來管理源碼。當(dāng)代碼倉庫為SVN倉庫而又想使用git時,恰好git svn工具可以滿足您的需求。

Warning

在使用 git svn 的時候,你實際是在與 Subversion 交互,Git 比它要高級復(fù)雜的多。盡管可以在本地隨意的進(jìn)行分支和合并,最好還是通過衍合保持線性的提交歷史,盡量避免類似與遠(yuǎn)程 Git 倉庫動態(tài)交互這樣的操作。
避免修改歷史再重新推送的做法,也不要同時推送到并行的 Git 倉庫來試圖與其他 Git 用戶合作。Subersion 只能保存單一的線性提交歷史,一不小心就會被搞糊涂。合作團(tuán)隊中同時有人用 SVN 和 Git,一定要確保所有人都使用 SVN 服務(wù)來協(xié)作——這會讓生活輕松很多。

Start

遠(yuǎn)程SVN倉庫地址:

svn://svnbucket.com/****/svn_test

本地git svn clone


git svn clone svn倉庫地址 -s可以將遠(yuǎn)程Subversion 倉庫導(dǎo)入到一個本地的 Git 倉庫中。-s 命令,它意味著標(biāo)準(zhǔn)布局(s 是 Standard layout 的首字母):Subversion 倉庫遵循了基本的分支和標(biāo)簽命名法則(如上圖trunk、tags、branches文件夾命名)。完整命令為:git svn clone svn倉庫地址 -T trunk -b branches -t tags;若您的倉庫命名與標(biāo)準(zhǔn)不一致請做出相應(yīng)的改動。

若出現(xiàn):Using higher level of URL: xxxxxx錯誤
使用git svn clone svn倉庫 -s --no-minimize-url具體可參考:
https://stackoverflow.com/questions/1453416/git-svn-clone-checkouts-wrong-repo

向SVN倉庫提交



可以看到本地git倉庫初始完成之后,本地代碼的管理完全基于git命令,只是向服務(wù)器倉庫提交代碼有變動使用git svn dcommit

拉取服務(wù)器最新代碼

sit svn fetch 能獲取最新的數(shù)據(jù),git svn rebase 才會在獲取之后在本地進(jìn)行更新 。



事實上sit svn fetch類似git fetch會將遠(yuǎn)程倉庫代碼拉取到本地對應(yīng)分支上:

需要牢記的一點是,Git 要求我們在推送之前先合并上游倉庫中最新的內(nèi)容,而 git svn 只要求存在沖突的時候才這樣做。假如有人向一個文件推送了一些修改,這時你要向另一個文件推送一些修改,那么 dcommit 將正常工作。
眾所周知SVN倉庫只保持單一的線性提交歷史,而不像git的commit歷史可以有合并的歷史“分叉”,所以使用git的本地分支盡可能使用rebase到主干master保持干凈的線性歷史對于svn dcommit來說是一個好的選擇。

分支操作-創(chuàng)建新的 SVN 分支

git svn branch [your_branch_name] -m "message"命令可以在svn服務(wù)器上創(chuàng)建一個新的分支等價于svn copy trunk branches/your_branch_name
若出現(xiàn):


git svn branch [your_branch_name] -m "test" --destination branches
詳情參閱:https://stackoverflow.com/questions/2974016/git-svn-branching

上述命令僅僅創(chuàng)建svn分支并不會切換分支。

切換分支并提交到SVN指定分支

使用git svn dcommit命令需要注意:

Git 通過搜尋提交歷史中 Subversion 分支的頭部來決定 dcommit 的目的地——而它應(yīng)該只有一個,那就是當(dāng)前分支歷史中最近一次包含 git-svn-id 的提交。

如果要提交到上面步驟在svn倉庫創(chuàng)建的new_branch分支,則需要基于該remote svn 分支創(chuàng)建一個本地分支(上例子的hotfix),基于hotfix分支修改執(zhí)行dcommit則提交到對應(yīng)的svn new_branch分支。查看hotfix分支的log:



可以發(fā)現(xiàn)其最近的git-svn-id記錄對應(yīng)的svn倉庫的new_branch分支,git svn執(zhí)行dcommit命令以此提交更改到對應(yīng)遠(yuǎn)程對應(yīng)分支。git svn rebase命令也類似會拉取new_branch的最新修改更新到本地。

合并更改到主分支

若是基于svn new_branch分支做了修改提交,例如在本地的hotfix分支(對應(yīng)svn的new_branch)分支開發(fā)完成了一個新模塊想合并到git主分支并且提交到master對應(yīng)的svn trunk分支該如何操作:



上述情況,new_branch已經(jīng)有提交"change for test" 而 master分支還停留在"add img"提交處:

git checkout master //切換到主分支

//合并分支使用--squash將commit記錄合并更新為一個新commit
git merge --squash hotfix  
git commit -am "merge new_branch branch features"
git svn dcommit

這樣就可以把new_branch通過git svn合并提交到svn的trunk,可以看到略顯麻煩并且在new_branch上的提交記錄被隱藏了;當(dāng)然也可以選擇使用svn來執(zhí)行svn 分支的合并然后再通過git svn rebase獲取更新到本地git分支。不過本博文旨在盡量弱化svn操作,盡可能使用git svn來完成版本的管理。

Tag操作

git svn tag操作與git svn branch 操作類似:


分支/Tag的刪除

由于git和svn分支的概念和管理上有很大差異,git svn命令沒有提供刪除svn 分支的方法。刪除svn分支通過svn命令刪除:

//1.刪除遠(yuǎn)程svn倉庫的分支
svn rm svn_branch_url -m 'messge:rm branch'
//2.刪除本地git對應(yīng)的追蹤分支
git branch -D -r remote_name/the_branch
//3.刪除本地git svn文件
rm -rf .git/svn/refs/remotes/your_branch


tag刪除是類似的:

svn rm $URL/tags/the_tag_will_delete // step 1
git branch -D -r remote_name/tags/your_tag_name
rm -rf .git/svn/refs/remotes/remote_name/tags/your_tag_name
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容