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

标签 git svn git-svn

我想使用 git-svn 将 SVN 树克隆到 git 存储库中。我想制作一个完整的克隆,包括标签和分支,但我在标签组织方面遇到了问题。

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

如您所见,所有标签都在这里,但一个太多了:Backup 标签实际上不是一个标签,而是一个包含标签的文件夹。问题是它创建了一个孤立分支,它复制了所有备份分支的内容。

问题是:如何让 git-svn 忽略备份文件夹但知道备份子文件夹作为标签,同时保持经典标签可用?

作为奖励:如何将备份标签自动命名为 Backup/20080217 而不是 20080217

谢谢!

最佳答案

git svn 不够智能,无法忽略一组标签中的 Backup 文件夹,但包含其子文件夹。您有很多选择,但都不是很好:

  • 更改底层 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 fetches 需要更长的时间。

  • 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”的标签文件夹,我不知道会发生什么。我怀疑没什么好东西。您需要找到一些避免这种情况的方法,或者将备份标签存储在具有不同名称的文件夹中。

关于带有奇怪的 svn 标签组织的 git-svn 克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485734/

相关文章:

git - 无法从 Git 存储库中删除子模块

windows - 在 Windows 上更新 Git Bash 后,仍然显示旧版本

用于浏览非 TortoiseSVN 的 SVN 存储库的 Windows 软件?

svn - 从项目中删除 Subversion 源代码控制 (Visual Studio/TortoiseSVN)

git - 如何在git中查找空分支和标签

git svn 并与私有(private)分支机构合作?

xcode - 我应该在 Swift playgrounds 的 .gitignore 文件中包含什么?

git - 如何找出哪些 Git 分支影响给定的子目录?

linux - svn合并问题(svn的3个级别)

GIT 与 SVN : How is it different in terms of commit (in GIT) and just save the changes locally in the file (in SVN)