2013-05-13 106 views
0

前段時間我把一個Subversion版本庫移到了Git和github上,當我決定開源一些軟件時,我不確定我做了什麼,但是提交歷史沒有移過來。當時我以爲我不在乎,但現在我想我實際上非常喜歡Github上2年以上的提交,如果沒有其他原因而不是工作記錄。問題在於我的項目在Github上已經有一段時間了,並且自創建以來已經分叉並收到了提交。移動歷史SVN提交到現有的Github回購?

有沒有辦法將我舊回購的歷史承諾「退回」,並將它們放入活的呼吸Github回購?

注意:我半心半意地嘗試svn2git --rebase,但我不確定這是否會工作,考慮到自svn回購被遺棄以來已經有提交。我得到這個錯誤,我不知道這意味着什麼:

command failed: 
2>&1 git svn fetch 

回答

2

祖先在git的無非是一個承諾(這是一個文本文件)包含讀取parent <hash of parent commit>一行或多行。如果你想在你的第一次提交之前插入歷史記錄,它需要一個像這樣的父行(第一次提交沒有),並且這將改變第一次提交的散列,這意味着它的後代將需要改變父代指針,並且這通過所有提交遞歸地提升,因爲所有提交都來自回購的第一次提交。

如果你不擔心弄亂從事叉子工作的人(因爲你會改變項目的歷史),那麼你可以重做操作來創建舊歷史的第二個git倉庫,添加回購作爲您的新回購的遠程並獲取更改,現在您將在新回購中擁有兩個根。您可能會收到關於沒有任何共同提交的警告;這可以。現在,您可以查看歷史記錄以獲取您的方向:git log --all --graph --oneline --decorate,然後可能執行rebase --onto將新回購的新工作移至您剛剛帶來的舊回購歷史記錄的頂部。假設新回購的第一次提交中的樹將與樹在你的舊回購的最後,所以這可能是如此簡單:git rebase --onto A B C,其中A是舊回購的歷史中的最後一個提交,您剛剛提交,B是新回購(這是正在考慮的新的回購的「舊基礎」,你不是重新回到舊的歷史,因爲它應該是相同的,並且C,這是新回購的分支機構的頭,你想重新分配到這個,可能master

您的回購可能會更復雜t韓,你可能需要做更多的工作來確定接縫的位置,以便重新加入事情,但這是總體思路。現在你可以使用git remote rm newrepo,「newrepo」就是你在添加遙控器時命名的任何東西。這應該清除第二個根目錄和所有提交的提交。最後,你可以強制推送給github。這實際上已經改變了每個提交散列,因此沒有一個分支會工作,但是你將擁有所有的歷史記錄,並且人們可以再次克隆,或者reset --hard到達新的master以追上。您可能希望在您的回購頁面上告知所有人這些信息,並且可能會找到分享並提醒他們意圖的人。

相關問題