我有一个历史悠久的现有 git 存储库。出于业务原因,我必须将该存储库镜像到 svn 服务器。我尝试了几种方法,但到目前为止总是失败。
2 回答
前段时间我很难做到,所以我从不同的来源收集了一些步骤来做到这一点。这个过程将保留你完整的 git 历史记录。在开始之前,请确保拥有存储库的备份副本。
首先要做的是创建一个空svn
存储库。完成后,请确保已git-svn
安装并编辑.git/config
您以跟踪您新创建的svn
存储库:
[svn-remote "svn"]
url = https://your.svn.repo
fetch = :refs/remotes/git-svn
现在你可以获取你的svn
repo:
git svn fetch
您应该在您的svn
repo 之后看到远程分支,您可以检查:
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
请注意,这种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。希望有帮助。