我想使用 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 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”的标签文件夹,我不知道会发生什么。我怀疑没什么好东西。您需要找到一些避免这种情况的方法,或者将备份标签存储在具有不同名称的文件夹中。
关于带有奇怪的 svn 标签组织的 git-svn 克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485734/