2

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

4

2 回答 2

2

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

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

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

现在你可以获取你的svnrepo:

git svn fetch

您应该在您的svnrepo 之后看到远程分支,您可以检查:

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 commitsvn-branch.

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

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

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

rm .git/info/grafts

检查您的图形 git 包装器是否svn-branchmaster祖先。

现在您几乎完成了,将您的历史记录重新设置在主干之上:

git svn rebase

现在您准备好svn使用

git svn dcommit

我创建了这个过程合并了我在这里这里找到的信息,因此感谢各自的作者。我修改了第一部分,因为建议的程序对我不起作用。

于 2013-03-31T13:10:46.363 回答
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。希望有帮助。

于 2013-05-06T16:01:36.863 回答