作为标题,有没有办法使用 git-svn(包含从 r1 开始的每个提交)从完整克隆中重建 svn 存储库?
编辑:
我可能应该补充一点,我正在寻找一种实用的方法来做到这一点(只要它像原始 svn 存储库一样保持可用,几乎完美的副本就可以了)
是的,可以创建一个非常接近 git-svn 存储库的 SVN 存储库(甚至可以从 Git 合并提交中恢复 svn:mergeinfo 并从 .gitignore 中恢复 svn:ignore)。这样做的步骤:
1.准备分支和标签:
为每个 refs/remotes/* 创建 refs/heads/* (当前的 refs/heads/* 位置将丢失):
$ git branch -a | awk '/remotes\/([^\/])+$/{ref=substr($1, 9); system("git update-ref refs/heads/" ref " refs/remotes/" ref )}'
或者您可以手动为所有有趣的分支设置 refs/heads/*
请注意,refs/heads/master 映射到 SVN 主干,但上面的脚本会将 refs/heads/trunk 设置为 refs/remotes/trunk。所以在运行它之后,应该将 refs/heads/master 设置为 refs/remotes/trunk 并删除 refs/heads/trunk:
$ git update-ref refs/heads/master refs/remotes/trunk
$ git branch --delete refs/heads/trunk
标签相同:将 refs/tags/* 设置为 refs/remotes/tags/* 位置:
$ git branch -a | awk '/remotes\/tags\/([^\/])+$/{ref=substr($1, 14); system("git update-ref refs/tags/" ref " refs/remotes/tags/" ref )}'
检查所有 refs/remotes/* 和 refs/remotes/tags/* 是否都转换为 refs/heads/* 和 refs/tags/* 因为只有这些引用会被转换。
2.创建一个空的SVN仓库
$ svnadmin path/for/svn/repository
3.创建一个包含 refs/heads/* 和 refs/tags/* 的裸 Git 存储库,在步骤 1 中准备好:
$ git clone --bare path/to/git-svn/repository path/for/svn/repository/.git
4. 使用此链接下载并安装 SubGit (从 Git 中删除“git-svn-id:”签名的中间版本会在转换时提交消息)。一般来说,SubGit 不是免费的,但对于一次性转换(您的情况),它可以免费使用。使用 SubGit 转换存储库(它希望在 path/for/svn/repository/.git 找到 Git 存储库)
$ subgit install path/for/svn/repository
5.SubGit 安装后,Git 和 SVN 存储库将保持同步。可选择中断双向同步(您可以随时启用它),运行
$ subgit uninstall path/for/svn/repository
理论上,可以重新创建一个非常接近原始 Subversion 存储库的存储库。但是,Subversion 存储库数据的某些方面(例如属性和合并信息)不是由git-svn
. 因此,您不一定能够重新创建原件的精确副本。