2014-02-21 22 views
3

考慮以下情形: - 2500上游儲存庫被存儲在SVN - GIT中用戶A導入儲存庫到GIT中並提交1個貼片 - 蹦用戶B導入倉庫到Git和承諾1個補丁 - 蹦用戶A希望合併來自git的用戶BGIT中底墊失敗,並從命令未知退出代碼(128):GIT中合併遞歸

補丁在這種情況下,如果用戶A使用git merge,然後git的歷史將被污染常見的svn提交(即代替2502提交,歷史將包含2501 + 2501 = 5002提交!)

如果用戶A使用git rebase,那麼git歷史將是正確的(2502提交)。這在這個簡單的情況下工作正常,但如果用戶A和用戶B早已不是1,但1000款然後每一個奇怪的併發症出現:git rebase -Xours失敗,出現以下消息:

First, rewinding head to replay your work on top of it... 
fatal: Could not parse object '98d7cd83de321e737b22240752cd178622d29406^' 
Unknown exit code (128) from command: git-merge-recursive 98d7cd83de321e737b22240752cd178622d29406^ -- HEAD 98d7cd83de321e737b22240752cd178622d29406 

你可以如使用以下github存儲庫重現此問題:

git clone https://github.com/opentk/opentk 
cd opentk 
git remote add mono https://github.com/mono/opentk 
git fetch mono 
git checkout -b integrate 
git rebase -Xours mono/rodo-consolidate-opentk 

有誰知道爲什麼會發生這種情況?任何想法如何解決這個問題?

+0

>在這種情況下,如果用戶A使用git的合併,然後git的歷史將與普通SVN提交(即替代2502款污染,歷史將包含2501+ 2501 = 5002提交!) - 不一定。 'git svn'在同一設置(svn.authors-file等)運行時,可以從給定的svn提交中獲得相同的git提交信息。 – user3159253

+0

謝謝,這很好理解。對於這個問題的範圍,'git svn'已經運行了不同的設置。這可以在我的帖子的github倉庫中的實踐中觀察到。 –

+0

順便說一句,如果使用rebase交互模式('rebase -i -Xours ...'),我設法__開始_「rebase」。但是在兩個分支中添加兩個文件時,rebase仍會停止/暫停。 – user3159253

回答

1

我有類似的問題,這個錯誤,我放棄rebase,而是使用cherry-pick來挑選的變化,它工作得很好。

+0

這就是我最終做的。 –

5

似乎這是一個很少需要探索的問題。我只是偶然發現了這個問題,正如this email中所建議的那樣,這個問題似乎是因爲您試圖將遞歸策略用於沒有父母的提交(例如,另一個存儲庫的主分支)。

在我的情況下,我加入了兩個git存儲庫,重新綁定另一個主服務器的主服務器。在你的情況下,轉換和合並svn回購,所以我想這幾乎是相同的情況。

在我的場景中,我再次使用strategy = recursive和strategy-option = renormalize來忽略煩人的行結束衝突。它工作得很好,雖然在給定的時間我不得不在歷史中間發佈一個額外的提交,只是爲了放棄提交文件中的行結尾(保留「修改」直到提交它們)。

這是我的方法來克服此問題:

  1. git rebase <branch> --strategy=recursive --strategy-option=ours
First, rewinding head to replay your work on top of it... 
fatal: Could not parse object '67fceed5a80ff78ac6f9a437620323131c88cd51^' 
Unknown exit code (128) from command: git-merge-recursive 67fceed5a80ff78ac6f9a437620323131c88cd51^ -- HEAD 67fceed5a80ff78ac6f9a437620323131c88cd51
  • git cherry-pick 67fceed5a80ff78ac6f9a437620323131c88cd51 (通知,則散列顯示在錯誤信息!)

  • 解決衝突(如果有的話)

  • git rebase --continue

  • 從第二次提交開始,遞歸戰略將工作,因爲他們都有父母(一個你剛剛櫻桃挑選的)。

    你將會遇到一些衝突,有些需要提交一段時間來規範化代碼,但是你不再會被大量無用的行結束衝突所困擾,這些衝突只會混淆並在合併代碼中造成錯誤。

    我認爲這是一個錯誤,因爲遞歸策略可能假設沒有父,應該使用'空'提交/工作樹作爲比較的基礎(因此提交中的所有內容都是實際添加並且沒有修改)。

    1

    其中一種可能的解決方法是使用git gc --aggressive刪除舊提交的所有鏈接。它對我有幫助。

    0

    到目前爲止這已經很老了,但是OP所尋找的選項是--root

    --root

    所有衍合提交從<branch>到達,而不是與<upstream>限制他們的 。這使您可以將分支上的根提交重新分配爲 。 [...]

    正如在另一個答案中提到的,這裏真正的問題是git期望找到一個不存在的父提交。具體來說,這發生在git正在尋找這兩個分支之間的合併基礎。 --root告訴git不要這樣做。

    感謝jthill他的回答https://stackoverflow.com/a/23312760