2012-03-13 38 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并提交该状态。
这不是一个真正的上帝解决方案(移动的文件是一个巨大的问题,自动合并的解决方案是肮脏的),但它足以观看和搜索历史