2012-03-13 19 views
1
  • 我有兩個項目。一個原始和一個
  • 的初始狀態是原始的較舊狀態。
  • 已對分支進行了更改,這些更改尚未完成。
    • (所有源代碼在的src/
    • (其中的一些變化是沉重的 lets-(移動/刪除)-lots-的檔案種種變化)
    • (這些修改已經完成,以數據沒有源)
    • (這些重的變化可能會被放棄。我可以恢復全部數據,但我想沒有這樣做)
  • 的變化已經在的歷史被applyed到手動在一些點。

現在我想在某種程度上都要加入的研究與開發歷史一起,該的回購得到一個乾淨的歷史有兩個:
中的變化正確的,按時間順序。重新加入它的原始叉的發展歷史


圖形:

(記住:那些歷史之間的連接是手動的svn合併)

 

     (I)--J--(K)--L--(M)--N---O fork 
     / / /
    A---B---C---D---E---F---H original 

應轉向:

 

    A---B---C---J---D---E---L---F---H--N---O fork 
    | | | 
    A---B---C---D---E---F---H original 


背景:

這兩個項目已經使用SVN開發,既projectes已轉換爲GIT,並上傳至Github上。
叉只基於結帳。與
每個同步已使用2個檢出,差異/補丁和一個文本編輯器完成;)

回答

0

如果我理解正確的話,你基本上要在原來的回購原樣,但刪除/移動的文件匹配叉(因爲對原始的所有更改已經在叉中)。由於fork實際上並不是一個fork(基於結帳),我可能會嘗試重放在fork中進行的刪除/移動操作。

Git的日誌,你可以使用--diff過濾參數,找出已被刪除和/或移動哪些文件。應該可以解析這個命令的輸出並在這個輸出上執行「git rm」(和「git mv」)。

要查看已刪除哪些文件,你可以這樣做:

git log --diff-filter=D --date-order --reverse --name-status | grep -E '^D[[:blank:]]+' 

這在我的回購收益率的一個:

D  dwgdirect/lib_340/vc10/dbg/td_gi.pdb 
D  dwgdirect/lib_340/vc10/dbg/td_gs.pdb 
D  dwgdirect/lib_340/vc10/dbg/td_spatialindex.pdb 
D  kernel/custom/dwgdirect/namespace.h 
D  std/res/hdracking/db/editablesettings.db 
D  std/res/hdracking/db/settings.db 
D  std/res/hdracking/om.res 

執行與上面相同,但以M代替d在 - diff篩選器和在grep regexp獲取移動的文件,例如

git log --diff-filter=M --date-order --reverse --name-status | grep -E '^M[[:blank:]]+' 

管道輸出到awk來解析出確切的文件名和擺脫D'S和M的(我不能讓AWK所以你必須嘗試了這一點爲自己在我的cygwin的工作)。將所有這些包裝在一個腳本中,每次掃描時在每行上都做「git rm」和「git mv」。

+0

不,你誤會了我,因此我改善了我的題 :)。我基本上想要將手工合併並將叉上的提交嵌入到原始歷史記錄中。 – Mappleconfusers 2012-03-14 11:54:35

+0

羅傑羅傑。 J,L,N和O提交有多少個?他們喜歡少數還是154? :) – ralphtheninja 2012-03-14 12:12:47

+0

〜700。我目前正在試圖交叉地交叉分叉(放棄所有svn合併提交),然後重新與原始的。 – Mappleconfusers 2012-03-15 00:16:05

1

我手動添加了叉子和櫻桃採摘的原始提交。此外,我重置狀態在最後和每個櫻桃選擇與原來的狀態後手動合併在svn並提交該狀態。
這不是一個真正的上帝解決方案(移動的文件是一個巨大的問題,自動合併的解決方案是骯髒的),但它足以觀看和搜索歷史