Когда вы используете 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. Таким образом, у вас есть один коммит, и тогда все на месте.