2012-12-10 49 views
3

我使用subgit將舊的svn版本庫轉換爲git(包括完整的歷史記錄,分支,標籤)。經過一些最初的麻煩,我得到了它的工作,它幾乎完美的工作。除了分支似乎並沒有被合併到主幹/ master分支:從svn切換後未融合Git分支

enter image description here

正如你所看到的,混帳知道我支綠色的主人可以得到黑色的分支。但似乎並不知道這個分支在承諾73653d1合併回主。它看起來像我放棄了那個分支,並且獨立地在主分支中的一次提交中實現了所有這些。

這不是一個正確的合併應該是什麼樣子,對嗎?有沒有辦法來解決這個問題?請注意,這是大約50次提交歷史記錄,除了看似缺少的參考,代碼也很好。

+0

缺少合併提交基本上意味着'svn merge'後樹幹沒有得到正確的_svn:mergeinfo_屬性。你可以運行'svn propget svn:mergeinfo ^/trunk @ rXYZ',其中'rXYZ'是'73653d1'的修訂版本。 mergeinfo是否包含分支的修訂版本r141:148? – vadishev

+0

'svn:mergeinfo ^/trunk @ r149'返回'/ branches/restructure:142-148' – Jawap

+0

@vadishev這是否意味着它已經與svn正確合併了?也許合併信息在切換到git期間只會丟失。 – Jawap

回答

5

所以,

R141:複製^ /後備箱^ /分支機構/重組
R142:修改^ /分支機構/重組
...
R148:修改^ /分支機構/重組
R149 :合併r142:148從^/branches/restructure到^/trunk

也就是說,在r149,沒有將^/branches/restructure的r141合併到^/trunk中。你可能知道,Git中的合併提交包含了每個父代的整個歷史記錄。這就是爲什麼SubGit在創建合併提交時檢查是否所有必需的修訂都合併到相應的分支中的原因。

在你的情況下,SubGit檢測到r141作爲^/branches/restructure的歷史記錄中的缺口,這就是爲什麼它沒有將此分支添加爲提交73653d1的合併父項。

有人可能會說:

R141沒有引入任何文件或目錄的修改,那麼爲什麼SubGit需求,包括此次修訂成的svn:合併信息?

那麼,在普通情況下,一個單一的SVN版本可以創建一個分支修改任何文件在裏面。這就是爲什麼SubGit仍會檢查分支歷史記錄中的每個修訂版。

但是,SubGit可能會更智能,並檢查創建分支的修訂版是否會修改其中的任何文件,因此對於您的情況,SubGit會自動創建合併提交。我們可能會在將來實施這一點;對於我們的跟蹤器,這裏是the issue

如何修復Git中的歷史記錄?

由於Subversion不允許對現有歷史記錄進行任何修改,因此您必須創建一個新版本,將缺少的r141添加到^/trunk的svn:mergeinfo屬性中。考慮做了以下內容:

$ svn switch ^/trunk . 
$ svn merge --record-only ^/branches/[email protected] . 
$ svn commit -m 'Merged r141 of restructure changes into the trunk' 

如果你保持Subversion和Git代碼庫同步,SubGit應自動翻譯此版本爲合併提交。否則,您可以從頭開始翻譯歷史記錄,或者只是再次將SubGit安裝到同一個SVN存儲庫中。

更新:
如果您不需要SVN同步了,如何修復Git存儲庫中的歷史記錄?

您可以改寫歷史的Git從73653d1開始的部分用下面的命令提交:

git filter-branch --parent-filter \ 
'test $GIT_COMMIT = 73653d1 && echo "-p 2ec9e8c -p 5c237f9" || cat' master 

NB:把完整的提交ID而非縮寫73653d12ec9e8c5c237f9

該命令應該將5c237f9提交作爲合併父項提交給73653d1提交。

希望有所幫助。

+0

非常感謝您的幫助。我嘗試過,但它看起來像我剛剛將該分支合併到我的主幹中,即使我(錯誤地)將它合併了很多修訂版本。是否有可能在Git中修復歷史記錄?我不會同步回到svn,我只能使用此回購的用戶。 – Jawap

+0

是的,您可以重寫部分歷史記錄,以便將合併父項添加到'73653d1'提交。我剛剛更新了我的答案。 – vadishev

+0

非常感謝!在改變父母之後,歷史的一部分在另一個基於主人的分支中重複出現,但我能夠重新設定它,我認爲現在一切都是正確的。我剛剛意識到你實際上是一個次級開發者之一,所以也非常感謝!也許你應該爲使用免費或開源許可的人設置捐贈按鈕。 – Jawap