将所有提交从一个仓库应用到另一个仓库

时间:2014-10-23 21:19:32

标签: git svn github migration git-svn

上下文:我的工作决定从subversion切换到git。他们有5个需要转换的svn repos,其中4个很小,可以在一小时内用git-svn迁移。最后一个更大,git-svn运行了几天并最终崩溃,所以我一直在试验其他工具,如subgit,svn2git,KDE的svn2git等等。所有这些工具都在同一时间失败,一年多前的修订,以及崩溃。

到目前为止,KDE的svn2git是最快和最有效的,它的规则允许我创建两个git repos:一个包含问题之前的所有提交,另一个包含所有提交之后的提交。现在我需要将它们正确地合并到一个git仓库中。

我知道如何将一个仓库添加为另一个仓库的远程并且樱桃选择提交(git: Apply changes introduced by commit in one repo to another repo),但我需要一种方法来完成整个仓库及其所有分支。

如何将一个仓库的所有提交应用于另一个仓库?

编辑:我正在寻找类似于git rebase所做的事情,以便历史记录在整个存储库中完整准确

3 个答案:

答案 0 :(得分:0)

您应该可以按照此链接中的说明进行操作:http://blog.dynamic50.com/2009/11/26/moving-your-git-repos-and-all-branches-to-a-new-remote-repository/

总而言之,在本地跟踪旧分支,添加新远程,然后将所有内容推送到它。

答案 1 :(得分:0)

这个怎么样:(请原谅我听起来很蠢)

假设:您有两个存储库,其中所有提交都在一个分支上。

  1. 将一个存储库提取到另一个存储库中。 (现在你有两个断开的分支)
  2. 将一个分支重新定位到另一个分支

答案 2 :(得分:0)

Github上很棒的人通过电子邮件给了我答案。

  1. 将git历史记录的早期部分提取到包含历史记录后面部分的Git存储库中:
  2. $ cd recenthistory $ git fetch ../oldhistory 'refs/*:refs/remotes/oldhistory/*'

    1. 对于历史记录的早期和后期出现的每个分支:

      • 在"最近"中找到分支上最早的提交。历史。这应该是一个孤儿提交(即,没有父母)所以它应该单独出现在这个命令的输出的最后一行:
    2. $ git rev-list --topo-order --parents refs/heads/$BRANCH | tail [...] bf0c6e839c692142784caf07b523cd69442e57a5 e497ea2a9b6c378f01d092c210af20cbee762475 e497ea2a9b6c378f01d092c210af20cbee762475 8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68 8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68 e83c5163316f89bfbde7d9ab23ca2e25604af290 e83c5163316f89bfbde7d9ab23ca2e25604af290

      • 创建一个移植物,使其看起来像这个提交实际上具有旧历史中相应分支的提示作为其父级:

      $ echo "e83c5163316f89bfbde7d9ab23ca2e25604af290 $(git rev-parse "refs/remotes/oldhistory/$BRANCH")" >>.git/info/grafts

      1. 在您的存储库中的所有分支完成第2步之后,使用git filter-branch使移植物永久化:
      2. $ git filter-branch --tag-name-filter cat -- --branches --tags Verify that the history is correct.

        1. 将生成的历史记录推送到GitHub存储库。请注意,如果您的GitHub存储库中已有分支或标记,则会覆盖它们!:
        2. $ git push origin --force --all $ git push origin --force --tags

          1. 从GitHub克隆一份新副本并仔细检查一切正常。

          2. 删除最近的历史和旧历史存储库(可能先备份)。这些存储库中的历史记录与GitHub中的历史记录不兼容,因此您希望确保不要在其中进行任何进一步的工作。