使用svn2git迁移SVN至Git后标签未同步到GitHub的技术求助
我看到你用svn2git把Debian上的SVN仓库迁移到Git后,遇到了标签没同步到GitHub、gitk里也看不到的问题——而且之前用GitHub官方导入工具还丢了提交历史,确实够闹心的。
先看你给出的svn2git输出,其实工具已经成功识别并拉取了SVN里的标签(比如refs/remotes/svn/tags/1.0.47、refs/remotes/svn/tags/2.0.24这些),只是它默认把SVN标签转换成了Git的远程跟踪分支,而不是真正的Git标签,所以本地gitk看不到,git push --all也只会推送分支,不会推送这些标签分支。
下面是具体的修复步骤:
1. 确认SVN标签的远程跟踪分支存在
先执行这个命令,看看svn2git已经拉取的标签分支:
git branch -r
你应该能看到类似svn/tags/1.0.47、svn/tags/2.0.24这样的条目,这说明标签数据已经在本地仓库里了。
2. 批量将SVN远程标签分支转换成Git本地标签
用这条命令批量处理所有标签,把SVN的远程跟踪分支转成Git标准标签:
git for-each-ref --format='%(refname:short)' refs/remotes/svn/tags | while read tag; do git tag "${tag#svn/tags/}" "$tag" done
这条命令的作用是:遍历所有refs/remotes/svn/tags下的分支,然后创建对应的Git标签,同时去掉前缀svn/tags/,让标签名和原来SVN里的一致(比如把svn/tags/1.0.47转成Git标签1.0.47)。
执行完后,你可以用git tag命令查看本地已经创建的标签,这时候gitk里也能看到这些标签了。
3. 将标签推送到GitHub
最后执行这条命令,把所有本地标签推送到GitHub仓库:
git push --tags
另外,如果以后再用svn2git迁移类似的仓库,你可以在命令里加上--tags参数(不过看你的输出,工具已经自动识别了标签路径,可能这个参数不是必须的,但加上更保险),确保迁移时直接生成Git标签:
svn2git https://localhost/svn/test-repository/space-invaders --username user --tags tags
这样就能完美保留SVN里的标签,同步到GitHub了。
内容的提问来源于stack exchange,提问作者JackPGreen

