如何將遠程SVN版本庫搬到本地

常常在寬帶網絡情況不佳的時候,訪問互聯網上的SVN庫是一件極其痛苦的事情,更別說要查看版本庫的日誌信息了。此時若是能夠將遠程版本庫整個同步到本地,而後全部操做都在本地的版本庫上進行,好處就不用多說了。幸運的是SVN已經提供了相應的功能,具體操做步驟以下: 
1)在本地創建一個新的版本庫: 
    svnadmin create D:\test 
2)建立鉤子文件pre-revprop-change.bat:(windows環境裏是D:\test\hooks\pre-revprop-change.bat) 
    文件中只須要一行內容便可「exit 0」。 
3)初始化同步操做: 
    svnsync init file:///D:/test <遠程SVN庫的URL> 
    (若是須要用戶名/密碼,則按提示輸入。成功後命令行將輸出信息:複製版本 0 的屬性) 
4)執行同步操做: 
    svnsync sync file:///D:/test 
   (若是須要用戶名/密碼,則按提示輸入。若是遠程SVN庫數據較多,須要慢慢等待) 
5)若是遠程SVN庫有了新的更新,只需重複執行步驟4便可。 


-------------- 

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

按以下步驟操做就能夠將SVN倉庫完整的轉換爲Git倉庫: 
1) 將遠程SVN倉庫搬到本地(這一步主要是爲了提升轉換的速度,也能夠忽略) 
   這裏假設最終要轉換的SVN倉庫爲file:///tmp/test-svn 

2) 使用git svn clone命令開始轉換 
    $ git svn clone file:///tmp/test-svn -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

注意不能單獨使用 $ git svn clone file:///tmp/test-svn,(trunk,branches,tags 分佈不標準也能夠)

本例中經過 git svn 導入的遠程引用,Subversion的標籤是看成遠程分支添加的,而不是真正的Git標籤。導入的Subversion倉庫彷彿是有一個帶有不一樣分支的tags遠程服務器。用「$ git show-ref」就能夠看到轉換後Git倉庫的相關狀況,結果相似以下: windows

$ 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。服務器

相關文章
相關標籤/搜索