所以,
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而非縮寫73653d1
,2ec9e8c
和5c237f9
。
該命令應該將5c237f9
提交作爲合併父項提交給73653d1
提交。
希望有所幫助。
缺少合併提交基本上意味着'svn merge'後樹幹沒有得到正確的_svn:mergeinfo_屬性。你可以運行'svn propget svn:mergeinfo ^/trunk @ rXYZ',其中'rXYZ'是'73653d1'的修訂版本。 mergeinfo是否包含分支的修訂版本r141:148? – vadishev
'svn:mergeinfo ^/trunk @ r149'返回'/ branches/restructure:142-148' – Jawap
@vadishev這是否意味着它已經與svn正確合併了?也許合併信息在切換到git期間只會丟失。 – Jawap