7

作为标题,有没有办法使用 git-svn(包含从 r1 开始的每个提交)从完整克隆中重建 svn 存储库?

编辑:

我可能应该补充一点,我正在寻找一种实用的方法来做到这一点(只要它像原始 svn 存储库一样保持可用,几乎完美的副本就可以了)

4

2 回答 2

9

是的,可以创建一个非常接近 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
于 2012-11-08T16:56:55.943 回答
1

理论上,可以重新创建一个非常接近原始 Subversion 存储库的存储库。但是,Subversion 存储库数据的某些方面(例如属性和合并信息)不是由git-svn. 因此,您不一定能够重新创建原件的精确副本。

于 2012-11-08T08:00:45.907 回答