2014-12-30 28 views
1

我正在準備svn2git遷移,而https://github.com/nirvdrum/svn2git一直非常有用,但我仍然以兩個惡意代碼作爲結束。我已經能夠清理其中大部分,但仍有一個。我有這樣的歷史:以非交互方式找到合併提交的正確父代

A1 - B1 - C1 - E1 - F1 
      \ 
A2 - B2 - C2 - D1 

A1-C1和A2-C2是相同的,除了一個額外的子目錄級別。 A2-C2實際上是svn遷移和之前git-filter-branch操作的產物,我確信這一點。 D1是標記爲release_2_0_4的合併提交。

我想擺脫A2-C2。我看到兩種方法:

  1. 未標記D1,標記C1,reflog過期和垃圾收集。噗! A2-C2消失了。
  2. 我也可以重寫D1的父母,所以它只有C1作爲父母,有一點git-filter-branch魔法。

可以使用第一種方法,因爲C1和D1的文件內容是相同的(與git diff C1 release_2_0_4檢查),但是然後我會失去提交日期,作者和消息。

第二種方法是:

git filter-branch --tag-name-filter cat --parent-filter 'test $GIT_COMMIT = [sha of release_2_0_4] && echo "-p [sha of FIRST parent of release_2_0_4]" || cat' -- --all

我已經嘗試過它與硬編碼SHA手動的方式,和它的作品。但我需要編寫腳本,而不知道SHA。

我知道如何找到D1的父母,他們可以與插入符號符號引用:release_2_0_4^1release_2_0_4^2(發現這裏:Get parents of a merge commit in git),但我不知道我怎麼能找出哪個是哪個。我在腳本中這樣做,而不是以交互方式,而其他git-filter-branch操作可能會更改SHA哈希值,所以我需要找到一種方法來確定我需要的兩個提交中的哪一個。我唯一的線索是C1有2個子提交,而C2只有一個子提交。

總之,我的問題是:

  • 我如何才能找到[sha of FIRST parent of release_2_0_4]
  • 如何將這個放在Bash腳本中,而不會有單引號,雙引號,變量擴展等混淆?

PS:我不需要擔心上游,沒有一個可能包含這段代碼的git倉庫被認爲是官方的,它們將不會在我給svn2git遷移開綠燈之前。

回答

1

我發現沒有可靠的方法來做到這一點,因爲git認爲每個父母都是平等的,並且只是按照它們得到的順序來使用它們。

所以我最終手動完成了,如上所述。