使用 cvs2svn 时,如何重命名符号以使分支和标记解析为相同的名称?

Posted

技术标签:

【中文标题】使用 cvs2svn 时,如何重命名符号以使分支和标记解析为相同的名称?【英文标题】:When using cvs2svn how can you rename symbols such that a branch and tag resolve to the same name? 【发布时间】:2008-10-01 13:28:04 【问题描述】:

我正在转换具有以下符号(以及其他符号)的 CVS 存储库:

tcm-6.1.0-branch -- 一个分支tcm-6.1.0 -- 一个标签

使用标准转换 cvs2svn 可以正确识别它们。但是,我想在转换过程中进行一些清理。具体来说,我想删除分支符号的冗余“-branch”部分,因为它将位于 svn 的“分支”目录中。我在项目的 symbol_transforms 中添加了以下内容:

RegexpSymbolTransform(r'(.*)-branch', r'\1')

现在每个文件都会出现“错误:符号 'tcm-6.1.0' 的多个定义 ...”,因为 tcm-6.1.0 既是分支又是标签。我有几个导致此问题的 CVS 符号对。

在我看来,由于源符号不同且目标目录不同,因此应该可以进行此操作。是我遗漏了什么还是这仅仅是 cvs2svn 的一个缺点?

如何重命名这些符号,使它们保持独立并产生具有相同名称的分支和标记?

--

如果没有解决办法,我会尝试从转换规则中排除有问题的符号,然后手动移动它们,尽管我宁愿在转换时这样做。

【问题讨论】:

【参考方案1】:

RegexpSymbolTransform 在解析存储库文件期间运行的级别太低。因此,如果您使用SymbolTransform 为两个符号赋予相同的名称,它们将被视为同一个符号。

可以在转换后重命名分支和标签,但这需要一个显式的 SVN 提交,该提交将永远保留在您的历史记录中,使历史探索变得更加复杂。

相反,您应该使用原始名称转换分支,然后告诉 cvs2svn 将其存储到 SVN 路径 /branches/tcm-6.1.0。这样,该符号将最终出现在具有所需名称的 SVN 分支的正确位置,但仍将被 cvs2svn 视为与名称相似的标签不同。

这可以使用--symbol-hints=symbol-hints.txt 命令行选项或SymbolHintsFileRule('symbol-hints.txt') 符号策略规则来完成,其中symbol-hints.txt 是一个包含如下行的文件:

。 tcm-6.1.0-branch 分支 /branches/tcm-6.1.0 .

我能想到的这种方法的唯一缺点是,cvs2svn 自动生成的一些提交消息(例如,用于创建分支)会提及原始分支名称。

【讨论】:

【参考方案2】:

cvs2svn 在 cvs 和 svn 之间做了很多神奇的事情。这就是为什么你不能“匹配”分支和标签的名称,因为这样 cvs2svn 将不知道哪个版本属于哪个目录。 我的建议是使用svnmucc 之类的工具在一次提交中重命名它们。 所以你有一个单一的提交,然后一切就到位了。

【讨论】:

以上是关于使用 cvs2svn 时,如何重命名符号以使分支和标记解析为相同的名称?的主要内容,如果未能解决你的问题,请参考以下文章

重命名文件而不使用 renameTo() - Java

当远程分支在 Git 中重命名时,如何更新我的本地引用?

git:重命名本地分支失败

如何使用 TortoiseGit 重命名远程分支?

Git 分支在推送时自动重命名

如何重命名本地 Git 分支?