實(shí)操 Svn 遷移到 Git
來(lái)源:segmentfault
不管是軟件工程師,還是硬件工程師,基本都會(huì)牽涉到版本管理的問(wèn)題。市面上版本管理的工具很多,但大家最熟悉的可能還是Svn和Git了。
以前很多工程師都習(xí)慣使用SVN,隨著Git工具的逐漸成熟和強(qiáng)大,很多公司就開(kāi)始轉(zhuǎn)移使用Git了。。。
本文分享一篇“實(shí)操 Svn 遷移到 Git”,來(lái)源:
導(dǎo)出 svn 工程
首先,我們需要git-svn
:
$ sudo yum install git-svn
or
$ sodu apt-get install git-svn
原理上,就是使用git svn clone ...
命令。如果你只是簡(jiǎn)單的執(zhí)行這個(gè)命令的話:
$ git svn clone http://rdsvn.company.net/some_mid_path/Branches/main
那么我們只是將主分支及其 log 取到了本地,但是其他的分支并沒(méi)有。如果要把所有的分支都 checkout 出來(lái)的話,需要用到--trunk
、--tags
、--branches
等選項(xiàng)。
需要注意的有三點(diǎn):
除了
trunk
單詞是單數(shù)之外,其他的選項(xiàng)單詞,請(qǐng)注意是復(fù)數(shù)。前者就是主分支的目錄了,而后者表示的則是對(duì)應(yīng)各個(gè)分支 / 標(biāo)簽的上層目錄。Git-svn 會(huì)將該目錄下的所有子目錄視為一個(gè)獨(dú)立的分支 / 標(biāo)簽進(jìn)行導(dǎo)出。這幾個(gè)選項(xiàng)指定的都是
相對(duì)路徑
,相對(duì)于你在git svn clone
后面緊跟著的路徑的位置。所以請(qǐng)不要在這些選項(xiàng)里面指定諸如 “http://” 開(kāi)頭的絕對(duì)地址。除了 trunk 之外,其他幾個(gè)相關(guān)選項(xiàng)可以重復(fù)指定。如果你的分支 / 標(biāo)簽分別在 svn 目錄上的不同文件夾下,可以多次指定。
于是,對(duì)應(yīng)我們的實(shí)際情況,git-svn 命令是這樣的:
git svn clone http://rdsvn.company.net/some_mid_path/ \ # 注意這里并沒(méi)有把主分支的路徑寫(xiě)完整
--trunk="Branches/main" --tags="Branches"
稍等一會(huì)兒,就可以看到整個(gè) svn 的主分支及分支都被導(dǎo)出來(lái)了,一顆賽艇!
分支處理
執(zhí)行git branch -a
可以看到相應(yīng)的分支已經(jīng)按照我們指定的選項(xiàng)建立起來(lái)了。我的實(shí)際情況,分支是這樣的:
trunk
tags/main_tag_25189
tags/main_tag_28141
tags/main_tag_28576
這幾個(gè)分支都被視為 Git 的遠(yuǎn)程分支,你的本地倉(cāng)庫(kù)暫時(shí)是空的??梢允褂?code style="box-sizing: border-box;font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size: 14px;color: rgb(232, 62, 140);overflow-wrap: break-word;">git checkout -b ...來(lái)將這幾個(gè)分支拉到本地。
講道理,svn 上的分支命名和 git 上的分支命名規(guī)則未必是一致的,因此這個(gè)時(shí)候你會(huì)想要重新命名分支。我的建議是這么操作:
在這個(gè)倉(cāng)庫(kù)中,首先把這幾個(gè)虛擬的遠(yuǎn)程分支 checkout 到本地保存下來(lái),這樣可以保存 change log
向服務(wù)器上傳主分支,一般分支名就是 master
將復(fù)制出來(lái)的其他分支,推到 git 服務(wù)器上,按照你希望的規(guī)則進(jìn)行命名
上傳到 git 服務(wù)器
首先要在 git 服務(wù)器上創(chuàng)建一個(gè)空的工程,比如 “git@rdgit.company.net/some_mid_path/some_group/firmware.git”
然后在本地倉(cāng)庫(kù)中執(zhí)行:
git remote add origin git@rdgit.company.net/some_mid_path/some_group/firmware.git
然后將主分支上傳:
git push origin trunk:master
其他的分支也是利用這個(gè)語(yǔ)句創(chuàng)建新分支上傳。
完成之后,在 git 服務(wù)器上就可以看到完整的 change log 以及分支變化情況啦。
關(guān)于空目錄
其實(shí)遷移的時(shí)候還需要注意一個(gè)問(wèn)題,那就是 svn 支持空目錄的版本控制,但是 git 不支持。
導(dǎo)出 svn 之后,最好對(duì)比一下原始的 svn 工程內(nèi)是否有空目錄。如果有,那么你需要手工(或者寫(xiě)腳本)在導(dǎo)出的 git 工程中創(chuàng)建這些目錄,并且在目錄中建立一個(gè) “.gitkeep
” 文件(這是約定俗成的做法),并且將這些文件git add .gitkeep
,以加入 git 的版本控制。這樣就以迂回的方式通過(guò) git 版本控制了目錄。
長(zhǎng)按前往圖中包含的公眾號(hào)關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!