git-svn克隆与奇怪的svn标签组织

时间:2012-02-28 16:26:06

标签: git svn git-svn

我想使用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

谢谢!

2 个答案:

答案 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工作得更快。