我有一个历史悠久的现有git存储库。出于商业原因,我必须将该存储库镜像到svn服务器。我尝试了几种方法,但到目前为止总是失败。
答案 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 commit
和svn
分支的哈希值:
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-branch
是master
祖先。
现在你差不多完成了,在树干上改变你的历史:
git svn rebase
现在您已准备好使用
提交svn
回购
git svn dcommit
答案 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。希望有所帮助。