準備
安裝 git svn
pkg install git-subversion-2.3.5
建立對應的使用者列表
在 svn project 目錄下,轉出 author.txt
svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' > author.txt
把 author.txt 轉換成需要的格式如下:
john = john
foo = foo
kevin = kevin
johnny = johnny
轉換 svn 到 git repo
git svn clone --trunk=/ --no-metadata --authors-file=author.txt svn://svn.my.doman/SVN-REPO-NAME NEW-GIT-REPO.git
這裡
強烈建議!強烈建議!強烈建議! 不要過 http_dav_svn,就算沒跑 svnserve ,設定一下跑起來不過是五分鐘以內的事,可以省掉很多奇怪的問題,尤其是當你是陳年的 repo 不知道裡面塞了什麼鬼東西的時候。
接下來砍站,把整個 repo 抓下來:
git svn fetch
如果你不聽話或是情非得已過 http_mod_dav 然後出錯了,那就重複跑到結束吧。
刪除過大檔案
現在 svn 已經成功的轉成 git 了,在 NEW-GIT-REPO.git,要把它丟上 github 了嗎?
先別急,先砍一砍裡面太肥的檔案吧。
Github 目前是超過 50 MB 會跳警告,大於 100 MB 會跳錯誤。
所以參考
官方網站的說明,用
BFG 來砍最簡單:
安裝 jre
pkg install openjdk8-jre-8.40.25_3
下載 bfg
fetch http://repo1.maven.org/maven2/com/madgag/bfg/1.12.3/bfg-1.12.3.jar
java -jar bfg-1.12.3.jar --strip-blobs-bigger-than 50M NEW-GIT-REPO.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive
塞上 github
去 github 上面把專案開好,然後照他給的下:
git remote add origin git@github.com:myORG/myProjectDir.git
git push -u origin master
萬一還是太大
如果你看到
Counting objects: 82461, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (29301/29301), done.
remote: fatal: pack exceeds maximum allowed size
error: pack-objects died of signal 132.00 GiB | 2.53 MiB/s
代表這一次的 commit 還是超過大小,只好拆開來塞:
這裡有教你這麼做:
git push -u origin HEAD~1000:refs/heads/master
git push -u origin HEAD~500:master
git push -u origin master
不過我的 revision range 語法一直看不懂所以我改成
git push -u origin 某個commit的hash:refs/heads/master
git push -u origin 另外某個commit的hash:master
git push -u origin master
因為 git push 後面給某個 commit 的意思是,把這個 commit 之前都 commit,所以分開塞就可以啦。
至於怎麼找這段呢,就:
git log --pretty=oneline
萬一你發現,連塞一個 commit 都不行的話,那就恭喜你啦!!!那個 commit 太大啦....
想辦法把那個 commit 分解一下吧....
參考資料