6


有一个 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 ......

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

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

4

6 回答 6

2

这可能很难做你想做的事。您可以通过以下方式将 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
于 2008-09-22T20:56:07.460 回答
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),请发表评论!在聪明的评论中,我将接受保留 git 历史记录并使用上面的第二个代码块移植到最新的 svn 修订版。

于 2008-09-27T18:08:51.850 回答
1

You may want to checkout Tailor. I used it to convert a git repository into an svn one so that my work could be hosted in our company svn server. It's quite flexible, so it may be able to do what you want.

于 2008-09-26T21:00:14.303 回答
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
于 2008-09-26T00:49:15.300 回答
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 应该更友好。

于 2010-08-24T00:33:28.220 回答
0

在处理 memcached 的 git 历史时,我做了很多工作。我正在做的很多工作是验证每个人的工作都得到了适当的认可。

我构建了一个工具来生成一个报告,该报告准确地显示了树在何处收敛,而不管提交哈希、git 历史、作者、提交者等如何......看看这个示例报告,我们用来查看两个包含相同信息的不相关存储库在哪里收敛.

从那里开始,我在谷歌和邮件列表搜索之后做了很多手动移植和filter-branching,以找出这些贡献更改的人实际上是谁。

于 2011-03-15T23:05:09.507 回答