将Git历史记录移植到SVN分支上

时间:2008-09-22 20:24:16

标签: svn git git-svn

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

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

你为什么这样做? (历史)
前段时间我开始玩Git。我开始在SVN控制下的项目中设置一个Git仓库。通过一点配置,我让Git和SVN在相同的源代码上并行工作。

这是我学习和玩Git的好方法,同时还拥有SVN的安全网。这是一个基本上有真实数据的沙箱。我没有时间真正学习 Git,但我真的很想修补它。这实际上是为我学习Git的好方法。

首先,在做了一些编辑之后,我会提交SVN,然后转到Git ......然后和Git一起玩,知道我的更改是安全的SVN。很快我就更频繁地向Git提交而不是SVN ...现在,SVN承诺已经陷入了我有时会做的烦人的苦差事。

在了解git revertsvn revert之间的区别时,我非常很高兴我一直在检查SVN回购。假设两者的工作原理相同,我几乎失去了几周的工作。

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

6 个答案:

答案 0 :(得分:2)

要做你想做的事情可能很难。您可以通过以下内容将git repo导入svn:http://code.google.com/p/support/wiki/ImportingFromGit,但我认为您会遇到冲突。您可以根据您的git repo从头开始重新创建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

答案 1 :(得分:2)

似乎 NOT 可能。虽然可以将当前的git repo加入到当前的svn repo中,但似乎无法将git repo的历史记录重放到svn repo中。

我遇到的主要问题是让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),请发表评论!在leu的聪明评论中,我只是接受使用上面的第二个代码块来保持git历史并嫁接到最新的svn修订版。

答案 2 :(得分:1)

我认为这应该是以两种方式中的一种方式实现的...我现在将概述它们,如果我能解决它们,试着将它们充实。如果有人能看到如何充实一部分或知道为什么一部分不起作用......请发表评论!

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 repo作为代理
(以下是伪命令他们不是真的 - 不要使用它们)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

从您尝试迁移到的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应该更友好。

答案 5 :(得分:0)

在从几件事情处理memcached的git历史时,我做了很多工作。我正在研究的很多东西都是为了确保每个人都得到了适当的工作记录。

我构建了一个tool来生成一个报告,无论提交哈希值,git历史记录,作者,提交者等等,都会准确显示树聚合的位置......看看我们曾经使用过的example report看看包含相同信息的两个不相关的存储库汇聚在哪里。

从那里开始,我在大量的谷歌和邮件列表搜索之后进行了大量的手动嫁接和filter-branch搜索,以确定这些实际贡献的人是谁。