我怎样才能将git历史推向svn

时间:2013-03-31 12:13:12

标签: git svn git-svn

我有一个历史悠久的现有git存储库。出于商业原因,我必须将该存储库镜像到svn服务器。我尝试了几种方法,但到目前为止总是失败。

2 个答案:

答案 0 :(得分:2)

我很久以前很难做到,所以我从不同来源收集了一些步骤来完成它。这个程序将保留你完整的git历史。 在开始之前,请确保拥有存储库的备份副本。

首先要做的是创建一个空的svn存储库。完成后,请务必安装git-svn并编辑您.git/config以跟踪新创建的svn回购:

[svn-remote "svn"]
url = https://your.svn.repo
fetch = :refs/remotes/git-svn

现在您可以获取svn个回购:

git svn fetch

您应该在svn回购后看到远程分支,您可以查看:

git branch -a

现在获取root commitsvn分支的哈希值:

git rev-list --parents master | grep '^.\{40\}$'
git rev-parse remotes/git-svn

创建移植物:

echo <hash-of-root-commit> <hash-of-svn-branch-commit> >> .git/info/grafts

现在,如果您使用git的图形包装(我使用tig),您应该会看到root commit来自svn-branch

此时你必须传播graft使其永久化:

git filter-branch -- remotes/git-svn --all

现在我们不再需要它了,所以我们可以删除它

rm .git/info/grafts

使用图形git包装器检查svn-branchmaster祖先。

现在你差不多完成了,在树干上改变你的历史:

git svn rebase

现在您已准备好使用

提交svn回购
git svn dcommit

我创建了此合并信息的程序我找到了herehere,所以感谢各自的作者。我修改了第一部分,因为建议的程序对我没用。

答案 1 :(得分:2)

请注意,git-svn方法导致部分历史记录丢失。考虑使用SubGit,它可以将Git存储库转换为SVN,保留所有分支的历史记录。

下面你可以找到一个在本地模式下使用SubGit的例子,即当Subversion和Git存储库都位于同一主机上时:

$ subgit configure SVN_REPO
# adjust SVN_REPO/conf/subgit.conf, so git.default.repository points to GIT_REPO
# adjust SVN_REPO/conf/authors.txt to map SVN usernames to Git identities
$ subgit install SVN_REPO
$ subgit uninstall --purge SVN_REPO

一旦我们以这种方式将Linux内核Git存储库转换为SVN。希望有所帮助。