【问题标题】:Grafting a Git history onto an SVN branch将 Git 历史移植到 SVN 分支上
【发布时间】:2008-09-22 20:24:16
【问题描述】:

情况
我有一个 Git 存储库和一个 SVN 存储库,它们都拥有相同的源代码但不同的提交历史。 Git repo 有很多小的评论很好的提交......而 SVN repo 有一些巨大的提交,比如“很多东西”。 这两个系列的提交都遵循代码中所做的相同更改,并且大致相同。

期望的结果
我想切换到使用 Git-SVN 而不会丢失当前 Git 存储库中的详细历史记录。这应该通过将 Git 存储库中的历史记录“嫁接”到项目的 SVN 分支(从我真正开始使用 Git 时开始的分支)来完成。

你为什么要这样做? (历史)
不久前,我开始玩 Git。我首先在一个受 SVN 控制的项目中设置了一个 Git 存储库。通过一些配置,我让 Git 和 SVN 在同一个源代码上并行工作。

这对我来说是学习和使用 Git 的好方法,同时仍然拥有 SVN 的安全网。它基本上是一个带有真实数据的沙箱。我没有时间真正学习 Git,但我真的很想修补它。这对我来说实际上是一个学习 Git 的好方法。

首先,在进行一些编辑后,我会提交给 SVN,然后提交给 Git……然后在知道我的更改在 SVN 中安全的情况下使用 Git。很快我就比 SVN 更频繁地提交 Git...现在,SVN 提交已成为我有时不得不做的烦人的家务活。

当了解git revertsvn revert 之间的区别时,我非常很高兴我一直在检查 SVN 存储库。假设两者的工作方式相同,我几乎失去了几个星期的工作。

我现在知道 Git-SVN 的荣耀,并且在其他几个项目中愉快地使用它。 当我开始时我完全意识到我可能会丢失我的 Git 存储库并且必须使用git-svn init '正确地'设置一个新的...但是现在已经使用 Git 一段时间了,我确信有一些黑客攻击的方法SVN 中的 Git 历史记录。

【问题讨论】:

    标签: svn git git-svn


    【解决方案1】:

    这可能很难做你想做的事。您可以通过以下方式将 git repo 导入 svn:http://code.google.com/p/support/wiki/ImportingFromGit,但我认为您会遇到冲突。您可以根据您的 git 存储库从头开始重新创建您的 SVN 存储库。

    为了将来参考,将 Git 用作 SVN 客户端可能会更容易:

    git-svn clone path/to/your/svn/repo
    git-commit -a -m 'my small change'
    vi some files to change.txt
    git-commit -a -m 'another small change' 
    git-svn dcommit # sends your little changes as individual svn commits
    

    【讨论】:

    • 不幸的是,链接的文章首先克隆了 svn 存储库以创建 git 存储库。由于在我的情况下两者都是已创建且非空的,因此它并没有真正的帮助。
    【解决方案2】:

    这似乎是不可能。虽然可以将当前的 git 存储库加入到当前的 svn 存储库中,但似乎无法将 git 存储库的历史重播到 svn 存储库中。

    我遇到的主要问题是让 git-svn “锁定”到单个 svn 提交。这个问题的答案似乎是git-svn set-tree。这篇博文很有帮助:
    http://www.reonsoft.com/~john/blog/2008/06/05/git-first-git-svn-later/

    这是尽我所能尝试将历史记录保存在 svn 中:

    git branch svn-reconsile HASH_OF_SECOND_COMMIT
    git checkout -f svn-reconsile
    
    git svn init file://path/to/repos/myproject/branches/git-import
    git svn fetch
    
    git svn set-tree HASH_OF_SECOND_COMMIT
    
    git rebase git-svn
    
    git merge master
    
    git svn dcommit
    

    问题是git svn dcommit 只会在 svn 中进行一次修订...而不是 master 分支中的每个提交都修改一次...因此历史在 svn 中被压缩。

    所以更简单的解决方案是简单地使用 set-tree 启动 git-svn 并确保历史记录仍在 git 中,即使它不在 svn 中。这可以通过以下方式完成:

    git svn init file://path/to/repos/myproject/branches/git-import
    git svn fetch
    
    git svn set-tree HASH_OF_MOST_RECENT_COMMIT
    
    git rebase git-svn
    

    如果有人知道如何解决挤压问题(我已经尝试过--no-squash),请发表评论!在聪明的 cmets 的 leu 中,我将接受保留 git 历史记录并使用上面的第二个代码块移植到最新的 svn 修订版。

    【讨论】:

      【解决方案3】:

      我认为这应该可以通过以下两种方式中的一种来实现……我现在将概述它们,如果我能弄清楚它们,稍后再尝试充实它们。如果有人可以看到如何充实某个部分或知道为什么某个部分不起作用...请发表评论!

      1 - 使用 git-svn 就位
      (以下是伪命令,它们不是真实的 - 不要使用它们)

      rm .svn
      (configure git-svn '/myproject/branch/git-remerge')
      git svn sync_versions --svn_revision=123 --hash=ad346f221455
      git svn dcommit
      

      2 - 使用单独的 git-svn 存储库作为代理
      (以下是伪命令,它们不是真实的 - 不要使用它们)

      mkdir ../svn_proxy
      cd ../svn_proxy
      git svn init
      git checkout hash_of_svn_branch_point
      git pull ../messy_repo
      

      【讨论】:

        【解决方案4】:

        您可能想结帐Tailor。我用它将一个 git 存储库转换为一个 svn 存储库,以便我的工作可以托管在我们公司的 svn 服务器上。它非常灵活,所以它可以做你想做的事。

        【讨论】:

        • 看起来这样可行!就我而言,我真的希望将其用作练习来更深入地了解 git ......所以我不打算尝试它......但如果其他人遇到同样的问题,我在关键任务上所做的事情。 .. 这看起来像一个杀手级应用!
        【解决方案5】:

        从您尝试迁移到的 git svn 存储库中,执行以下操作:

        git remote add old-repo <path-to-old-repo>
        git fetch old-repo
        # to browse and figure out the hashes, if that helps
        gitk --all &
        
        # for each branch you want to graft
        git rebase --onto <new git svn branch base> <old-repo branch base> <old-repo branch tip>
        
        # when done
        git remote rm old-repo
        

        供您参考,您也应该能够使用 git format-patch 和 git am 做同样的事情,但 git rebase 应该更友好。

        【讨论】:

          【解决方案6】:

          在处理 memcached 的 git 历史时,我做了很多工作。我正在做的很多工作是验证每个人的工作是否正确。

          我构建了一个tool 来生成一个报告,该报告准确地显示了树的收敛位置,而不管提交哈希、git 历史、作者、提交者等...看看这个example report,我们曾经看到两个不相关的地方包含相同信息的存储库融合在一起。

          从那里,我只是做了很多手动移植和filter-branching,经过大量谷歌和邮件列表搜索,以确定这些贡献更改的人实际上是谁。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-22
            • 2019-01-30
            • 2021-09-30
            • 2018-03-11
            • 2015-07-24
            • 1970-01-01
            • 2021-09-03
            • 2017-12-08
            相关资源
            最近更新 更多