我想使用git-svn将SVN树克隆到git repo中。我想制作一个完整的克隆,包括标签和分支,但我遇到了标签组织的问题。
SVN标签文件夹如下所示:
tags/
|-- Backup
| |-- 20080212
| `-- 20080217
|-- V4.0.1
|-- V4.0.2
`-- V4.0.3
我知道git svn clone -T trunk -b branches -t tags/Backup -t tags
有两倍-t
选项,但这并不完全令人满意:
$ git branch -r
tags/20080212
tags/20080217
tags/Backup
tags/V4.0.1
tags/V4.0.2
tags/V4.0.3
trunk
正如您所看到的,所有标签都在这里,但有一个太多了:备份标签实际上不是标签,而是包含标签的文件夹。问题是它创建了一个孤立分支,它复制了所有备份分支的内容。
问题是:如何让git-svn忽略备份文件夹但知道备份子文件夹为标签,保持经典标签可用?
作为奖励:如何自动将备用代码命名为Backup/20080217
而不是20080217
?
谢谢!
答案 0 :(得分:3)
git svn
不够聪明,无法忽略一组代码中的“备份”文件夹,但包含其子文件夹。你有很多选择,但都不是很好:
更改基础Subversion存储库以将所有标记移动到子文件夹中,因此您的存储库看起来像这样:
tags/
|--Backup/
| |--20080212
| `--20080217
`--Versions/
|--V4.0.1
|--V4.0.2
`--V4.0.3
然后,您可以使用-t tags/Backup -t tags/Versions
来获取所有代码。
应对。虽然恼人,Git管理树对象的方式意味着拥有“备份”标签实际上不会占用更多空间或减慢大多数Git操作;唯一影响将是git svn fetch
es需要更长的时间。
为git-svn
编写自己的补丁以启用此方案。如果你将它包含在未来的官方Git版本中,可以获得奖励积分。
让标签具有不同的名称至少相当容易。如果您编辑.git/config
文件,则应该找到如下所示的行:
tags = tags/Backup/*:refs/remotes/tags/*
您应该可以将此更改为以下内容:
tags = tags/Backup/*:refs/remotes/tags/Backup/*
如果您在运行git svn init
和第一个git svn fetch
之间执行此操作,那么一切都应该正常运行。否则,您可能需要首先手动删除旧引用,方法是删除名称与.git/logs/refs/remotes/tags/
,.git/svn/refs/remotes/tags/
和.git/refs/remotes/tags
中的代码名称相匹配的任何文件或文件夹。
我不知道如果您有一个名为“Backup”的标签和一个名为“Backup”的标签文件夹会发生什么。我怀疑没什么好事。您需要找到避免这种情况的方法,或将备份标记存储在具有不同名称的文件夹中。
答案 1 :(得分:0)
使用SmartGit克隆存储库,它会创建正确的标记,提供更好的翻译,并且比git-svn工作得更快。