簡體   English   中英

從svn切換后,Git分支未合並

[英]Git branches not merged after switching from svn

我使用subgit將舊的svn存儲庫轉換為git(包括完整的歷史記錄,分支,標記)。 經過一些初步的麻煩,我得到了它的工作,它幾乎完美的工作。 除了分支似乎沒有合並回主干/主分支:

在此輸入圖像描述

正如你所看到的,git知道我將綠色主人分支以獲得黑色分支。 但它似乎並不知道這個分支在提交73653d1被合並回主73653d1 它看起來就像我放棄了那個分支,並在master分支中的一次提交中獨立實現了所有這些。

這不是正確合並的樣子,對吧? 有沒有辦法來解決這個問題? 請注意,這是歷史上約50次提交,除了看似缺失的引用之外,代碼還可以。

所以,

r141:復制^ / trunk到^ / branches / restructure
r142:修改^ /分支/重組
...
r148:修改^ /分支/重組
r149:從^ / branches / restructure到^ / trunk合並r142:148

也就是說,在r149沒有將^ / branches / restructure的r141合並到^ / trunk中。

您可能知道,Git中的合並提交包括其每個父級的整個歷史記錄。 這就是為什么SubGit會在創建合並提交時檢查是否所有必要的修訂都合並到相應的分支中。

在你的情況下,SubGit檢測到r141作為^ / branches / restructure歷史中的間隙,這就是為什么它沒有將此分支添加為提交73653d1的合並父73653d1

有人可能會說:

r141沒有引入任何文件或目錄修改,為什么SubGit需要將此修訂包含到svn:mergeinfo中?

嗯,在一般情況下,單個SVN修訂版可以創建一個分支修改其中的任何文件。 這就是SubGit仍然檢查分支歷史中每個修訂版的原因。

但是,SubGit可能會更聰明,並檢查創建分支的修訂是否修改其中的任何文件,因此對於您的情況,SubGit將自動創建合並提交。 我們將來可能會實施; 這是我們跟蹤器上的問題

如何修復Git的歷史?

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

$ svn switch ^/trunk .
$ svn merge --record-only ^/branches/restructure@148 .
$ svn commit -m 'Merged r141 of restructure changes into the trunk'

如果保持Subversion和Git存儲庫同步,SubGit應自動將此修訂轉換為合並提交。 否則,您可以從頭開始翻譯歷史記錄,或者只是再次將SubGit安裝到同一個SVN存儲庫中。

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

您可以使用以下命令從73653d1 commit開始重寫Git歷史記錄的一部分:

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

注意:將完整的提交ID而非縮寫73653d12ec9e8c5c237f9

此命令應將5c237f9提交添加為5c237f9提交的合並父73653d1

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM