如何將SVN倉庫轉換為Git倉庫


按如下步驟操作就可以將SVN倉庫完整的轉換為Git倉庫:
1) 將遠程SVN倉庫搬到本地(這一步主要是為了提高轉換的速度,也可以忽略)
    這里假設最終要轉換的SVN倉庫為file:///tmp/test-svn
 
2) 使用git svn clone命令開始轉換
    $ git svn clone http://demo.democmp.com:81/svn/demo_repo  --no-metadata -T trunk -b branches -t tags
    git svn clone 命令會把整個Subversion倉庫導入到一個本地的Git倉庫中。這相當於針對所提供的 URL 運行了兩條命令git svn init加上gitsvn fetch。因Git需要提取每一個版本,每次一個,再逐個提交。對於一個包含成百上千次提交的項目,花掉的時間則可能是幾小時甚至數天(如果你的SVN倉庫是遠程網絡訪問的,先執行上面第一步的操作還是有點好處的。不過項目通常提交次數都不少,漫長的等待是少不了的啦,慢慢等吧)。
-T trunk -b branches -t tags告訴Git該Subversion倉庫遵循了基本的分支和標簽命名法則。如果你的主干(trunk,相當於Git里的master分支,代表開發的主線)、分支或者標簽以不同的方式命名,則應做出相應改變。由於該法則的常見性,可以使用-s來代替整條命令,它意味着標准布局(s是Standard layout的首字母),也就是前面選項的內容。下面的命令有相同的效果:
  $ git svn clone file:///tmp/test-svn -s
 
實際測試:

輸入如下命令

$ git svn clone file:///E:/code_exer/svn_repo -s

然后報錯:

Can't create session: Unable to connect to a repository at URL 'file:///E:/code_exer/svn_repo': Unable to open repository 'file:///E:/code_exer/svn_repo' at /mingw64/share/perl5/site_perl/Git/SVN.pm line 305.

解決辦法:

出現這個錯誤原因在路徑上 file:///E:/code_exer/svn_repo ”,只需把e:/改為e/,如果改了后還會出現問題,把-s去了試一試

 
注意本例中通過 git svn 導入的遠程引用,Subversion的標簽是當作遠程分支添加的,而不是真正的Git標簽。導入的Subversion倉庫仿佛是有一個帶有不同分支的tags遠程服務器。用“$ git show-ref”就可以看到轉換后Git倉庫的相關情況,結果類似如下:
$ git show-ref
1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/heads/master
aee1ecc26318164f355a883f5d99cff0c852d3c4 refs/remotes/my-calc-branch
03d09b0e2aad427e34a6d50ff147128e76c0e0f5 refs/remotes/tags/2.0.2
50d02cc0adc9da4319eeba0900430ba219b9c376 refs/remotes/tags/release-2.0.1
4caaa711a50c77879a91b8b90380060f672745cb refs/remotes/tags/release-2.0.2
1c4cb508144c513ff1214c3488abe66dcb92916f refs/remotes/tags/release-2.0.2rc1
1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/remotes/trunk
而普通的 Git 倉庫是類似如下模樣:
$ git show-ref
83e38c7a0af325a9722f2fdc56b10188806d83a1 refs/heads/master
3e15e38c198baac84223acfc6224bb8b99ff2281 refs/remotes/gitserver/master
0a30dd3b0c795b80212ae723640d4e5d48cabdff refs/remotes/origin/master
25812380387fdd55f916652be4881c6f11600d6f refs/remotes/origin/testing
這里有兩個遠程服務器:一個名為gitserver,具有一個master分支;另一個叫origin,具有master和testing兩個分支。
 
3) 獲取SVN服務器的最新更新到轉換后的Git倉庫(這步通常在連續的轉換過程中就沒必要了)
    $ git svn rebase
 
4) 轉換SVN倉庫的svn:ignore屬性到Git倉庫的.gitignore文件
    $ git svn create-ignore
    該命令自動建立對應的.gitignore文件,以便下次提交的時候可以包含它。如果在生成.gitignore文件前想先查看一下,運行命令“git svn show-ignore”即可。
 
5) 轉換SVN的標簽為Git標簽
    $ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
    $ rm -Rf .git/refs/remotes/tags
    該命令將原本以 tag/ 開頭的遠程分支的索引變成真正的(輕巧的)標簽。
    這個在Window下試過不行,報”cp: cannot stat `.git/refs/remotes/tags/*': No such file or directory“的錯誤,可以使用如下兩個標准命令處理:
$ git tag tagname tags/tagname     ----用指定的分支創建一個Git標簽
$ git branch -r -d tags/tagname    ----刪除指定的遠程分支
 
6) 轉換SVN的分支為Git分支
    $ cp -Rf .git/refs/remotes/* .git/refs/heads/
    $ rm -Rf .git/refs/remotes
    該命令把refs/remotes下面剩下的索引變成Git本地分支
 
7) 最后把轉換后的本地Git倉庫推到公共的Git服務器
    $ git remote add origin [遠程Git服務器地址]
    $ git push origin master --tags
    所有的標簽和主干現在都應該整齊干凈的躺在新的Git服務器里了。如果要將分支也同步到遠程Git服務器,將--tags改為--all。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM