如何合并来自错误 svn 迁移的 git 历史 - 旧存储库

How to combine git history from wrong svn migration - old repository

我们有一个从 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) 现在我们想将旧历史添加到工作中(从 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 

现在我们有两个存储库。第一次迁移正在使用并包含积极的开发,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) 期间所做的第一次提交(作为文档参考)

在这些操作之后,完整的历史记录在远程存储库上可用,但历史记录似乎断开连接

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

感谢 alo-malbarez here and this 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

这解决了我的问题。