作为标题,有没有办法用git-svn(包含从r1开始的每一次提交)从完整克隆重建svn repo?
编辑:
我可能应该补充一点,我正在寻找一种实用的方法来做到这一点(只要原始的svn存储库仍然可以使用,近乎完美的副本就可以了)
答案 0 :(得分:8)
是的,可以创建一个SVN存储库,而不是靠近你的git-svn存储库(甚至从Git merge commits和svn:ignore from .gitignore恢复svn:mergeinfo)。这样做的步骤:
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.创建一个包含在步骤1准备的refs / heads / *和refs / tags / *的裸Git存储库:
$ git clone --bare path/to/git-svn/repository path/for/svn/repository/.git
4.使用此link下载并安装SubGit(中间构建删除" git-svn-id:" Git签名在转换时提交消息)。一般来说,SubGit不是免费的,但对于一次性转换(您的情况),它可以免费使用。使用SubGit转换存储库(它希望在path / for / svn / repository / .git中找到Git存储库)
$ subgit install path/for/svn/repository
5.在SubGit安装完成后,Git和SVN存储库将保持同步。可选择打破双向同步(您可以随时启用它),运行
$ subgit uninstall path/for/svn/repository
答案 1 :(得分:0)
理论上,可能重新创建一个非常接近原始Subversion存储库的存储库。但是,git-svn
未克隆Subversion存储库数据(如属性和mergeinfo)的某些方面。因此,您不一定能够重新创建原始的完全副本。