При использовании cvs2svn как вы можете переименовать символы так, чтобы ветвь и тег разрешались к одному и тому же имени? - PullRequest
2 голосов
/ 01 октября 2008

Я работаю над преобразованием хранилища 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 ]

1 голос
/ 02 октября 2008

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-филиал /branches/tcm-6.1.0.

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

1 голос
/ 01 октября 2008

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

...