如何將具備歷史記錄的SVN存儲庫遷移到新的Git存儲庫?

我閱讀了Git手冊,常見問題解答,Git-SVN崩潰課程等,它們都對此進行了解釋,可是在任何地方都找不到像這樣的簡單說明: html

SVN存儲庫位於: svn://myserver/path/to/svn/repos git

Git存儲庫位於: git://myserver/path/to/git/repos github

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

我不但願它那麼簡單,也不但願它是單個命令。 但我確實但願它不會嘗試解釋任何內容-僅說明在此示例中應採起的步驟。 shell


#1樓

GitHub如今具備從SVN存儲庫導入的功能。 我歷來沒有嘗試過。 windows


#2樓

另外,當嘗試使用git-svn dcommits進行git時,git-stash命令是天賜的禮物。 bash

典型過程: 服務器

  1. 設置git repo
  2. 在不一樣的文件上作一些工做
  3. 決定使用git檢查一些工做
  4. 決定svn-dcommit
  5. 獲取可怕的「沒法提交帶有髒索引的錯誤」錯誤。

解決方案(須要git 1.5.3+): 網絡

git stash; git svn dcommit ; git stash apply

#3樓

TortoiseGit作到了。 請參閱此博客文章: http : //jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients app

是的,我知道用連接回答不是很出色,但這是一種解決方案,是嗎? svn


#4樓

僅使用git,SVN和bash的擴展答案。 它包括不使用Trunk / Branches / tags目錄佈局使用常規佈局的SVN存儲庫的步驟(SVN絕對不執行這種佈局)。

首先使用此bash腳本掃描您的SVN存儲庫,以查找作出貢獻的不一樣人員,並生成映射文件的模板:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

使用它建立一個authors文件,在其中將svn用戶名映射到開發人員使用git config屬性user.nameuser.email設置的svn用戶名和電子郵件(請注意,對於GitHub這樣的服務,僅具備匹配的電子郵件就足夠了)。

而後讓git svn將svn存儲庫克隆到git存儲庫,並告訴它有關映射的信息:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

因爲git svn會分別檢出存在的每一個標記或分支的每一個修訂,所以這可能會花費很是長的時間。 (請注意,SVN中的標籤實際上只是分支,所以它們最終會在Git中結束)。 您能夠經過刪除不須要的SVN中的舊標籤和分支來加快此過程。

在同一網絡或同一服務器上的服務器上運行它也能夠真正加快此過程。 另外,若是因爲某種緣由該過程被中斷,您能夠使用

git svn rebase --continue

在不少狀況下,您已經在這裏完成了。 可是,若是您的SVN存儲庫具備很是規的佈局,而您僅想在SVN中有一個目錄,您想要放入git分支,則能夠執行一些額外的步驟。

最簡單的方法是在服務器上製做一個遵循約定的新SVN存儲庫,並使用svn copy將目錄放置在主幹或分支中。 若是您的目錄一直位於倉庫的根目錄,這多是惟一的方法,當我上次嘗試此git svn只是拒絕執行簽出操做。

您也可使用git執行此操做。 對於git svn clone只需使用要放入git分支的目錄便可。

運行後

git branch --set-upstream master git-svn
git svn rebase

請注意,這須要Git 1.7或更高版本。


#5樓

這是一個沒有依賴關係的簡單shell腳本,它將一個或多個SVN存儲庫轉換爲git並將其推送到GitHub。

https://gist.github.com/NathanSweet/7327535

在大約30行腳本中:使用git SVN進行克隆,從SVN :: ignore屬性建立一個.gitignore文件,推送到裸git倉庫,將SVN幹線重命名爲master,將SVN標籤轉換爲git標籤,而後將其推送到GitHub同時保留標籤。

我很費力地將十幾個SVN存儲庫從Google Code遷移到GitHub。 我使用Windows並無幫助。 Ruby在個人舊Debian盒子上壞透了,讓它在Windows上運行真是個笑話。 其餘解決方案沒法與Cygwin路徑配合使用。 即便我能夠正常工做,也沒法弄清楚如何在GitHub上顯示標籤(祕密是--follow-tags)。

最後,我將上面連接的兩個簡短腳本拼湊在一塊兒,效果很好。 解決方案不須要比這更復雜!

相關文章
相關標籤/搜索