WeHack BBS
将 git-svn 版本库与原 svn 版本库重建关联的做法 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 程序设计讨论区 (https://bbs.wehack.space/forum-14.html)
+--- 主题: 将 git-svn 版本库与原 svn 版本库重建关联的做法 (/thread-373.html)



将 git-svn 版本库与原 svn 版本库重建关联的做法 - vimacs - 12-12-2023

今天有人提出了把某个 svn 版本库迁移到 git 的需求,然而这个项目的开发依然要在 svn 上进行。我的想法是用 git-svn, 而且在这个项目上我也用过它。但是如果要把它放到一个公共的 git 仓库上,就觉得有点奇怪了,因为把这个 git 仓库克隆下来之后,还要将它关联到相应的 svn 仓库上,而通常这个操作又要再做一次 git svn fetch.

我查询了一下将 git-svn 版本库关联到 svn 版本库的做法,基本都是用 git-svn 重新建立一个版本库,这样做很费时间。后来我看到 git-svn(1) 里面提到的一个做法,具体做法是先在一个公用服务器上用 git-svn 创建一个版本库,然后每个要用这个版本库的人将 remote 指向这个公用的 git-svn 版本库,然后以下命令调整 git fetch:
引用:# Clone locally - make sure the refs/remotes/ space matches the server
git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'

最后再 git svn init 和 git svn rebase. 我试了一下,这样的确可以快速重建一个 git-svn 版本库,而不用再从 svn 获取每个版本。

我仔细观察了一下这个操作的效果,发现问题的核心是 git-svn 版本库有一个名为 remote/git-svn 的特殊引用,我看了一下 .git/refs/remote/git-svn 这个文件,它就是 git-svn 版本库最新的 commit 的 id. 我试着从 GitLab 上拉一个我转换好的 git 版本库,手动创建这个文件,再用 git svn init 和 git svn rebase,果然可以重建整个 git-svn 仓库。