Когда вы используете cvs2svn, как вы можете переименовывать символы так, чтобы ветвь и тег соответствовали одному и тому же имени?

Я работаю над преобразованием репозитория 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?

Как я могу переименовать эти символы так, чтобы они оставались отдельными и приводили к ответвлению и тегу с тем же именем?

-

Если обходных путей нет, я постараюсь исключить проблемные символы из правил преобразования и впоследствии переместить их вручную, хотя я бы предпочел сделать это во время преобразования.

2 ответа

Решение

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 branch /branches/tcm-6.1.0 .

Единственный недостаток этого подхода, о котором я могу подумать, заключается в том, что некоторые сообщения о коммитах автоматически генерируются cvs2svn (например, для создания ветки) упомянет оригинальное название ветви.

cvs2svn делает много магии между cvs и svn. Вот почему вы не можете "сопоставить" имена веток и тегов, так как тогда cvs2svn не будет знать, какая версия принадлежит какой директории. Мой совет - переименуйте их впоследствии в один коммит с помощью такого инструмента, как svnmucc. Таким образом, у вас есть один коммит, и тогда все на месте.

Другие вопросы по тегам