12-12-2023, 06:57 PM
今天有人提出了把某个 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:
最后再 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 仓库。
我查询了一下将 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 仓库。