如何从错误的svn迁移中合并git历史记录-旧存储库

时间:2018-06-28 10:33:53

标签: git svn git-rewrite-history

我们有一个从SVN迁移的git存储库。让我们将其命名为WORKING。 由于使用svn复制文件夹操作,历史记录无法很好地迁移。 错误是:

SVN :  r1    \ --> common folder --> Project1 \ folder1
                                                file2 
  . 
  .  some time later
  .
  . 
SVN :  r1000 \ --> Common folder
               --> Project1 \ folder1
                              file2  
                    ^
                    |
                    ------> this folder has been migrated to GIT

此更改导致历史记录迁移不完整(仅从HEAD出现到r1000) 现在,我们要将旧的历史记录添加到WORKING中(从r1000到r1),我们创建了一个新的git存储库,其中包含缺少的历史记录(名称为OLDEST)。历史记录日志显示为:

WORKING --> A (1.2018) - B (2.2018) - C (3.2018) - D (HEAD)
OLDEST --> E (1.2016) ... F (1.2017) 

我们想要此日志历史记录

WORKING --> E ... F --> A - B - C 

路径完全相同,当您看到文件的完整历史记录时,我们希望保留历史记录。我进行的测试无法混合这些历史记录,可以吗?

更多详细信息

我使用

迁移了存储库
URL=http://server.name/project1
git svn clone --authors-file=authors.txt $URL -r1000:HEAD first-migration 

一段时间以后我就完成了

URL=http://server.name/common/
git svn clone --authors-file=authors.txt $URL -r1:1000 second_migration
cd second_migration
git filter-branch 

现在我们有两个存储库。 first_migration正在使用中并包含积极的开发,second_migration包含旧版本(从1-1000开始)

Mi当前的解决方案是:

mkdir migration
cd migration
git init
git remote add newest ssh://gitserver:first-migration
git remote add older  ssh://gitserver:second-migration
git remote update 
git checkout newest/master -b new.master
git checkout 1abc2def3   -b new.firstcommit 
git checkout older/master -b old.master
git rebase --preserve-merges --root --committer-date-is-author-date new.master
git checkout new.master -b master
git remote add fullhistory ssh://gitserver:final.git
git push fullhistory --all 

在这种情况下,new.firstcommit是我在第一次迁移(r1000)期间进行的第一次提交(作为文档参考)

完成这些操作后,完整的历史记录可在远程存储库上找到,但历史记录显示为已断开连接

enter image description here

我的问题是关于如何更好地整合历史。

1 个答案:

答案 0 :(得分:0)

感谢alo-malbarez herethis page的评论,我可以解决问题。最终我做到了:

git checkout old.master
git cherry-pick new.firstcommit
# I commit the day I merged histories. 
git commit --allow-empty -m "Mixing histories"
git rebase -s recursive -Xtheirs --onto old.master new.firstcommit new.master
git push --all --tags

这解决了我的问题。