cvs2svn включить одну ветку и голову? - PullRequest
2 голосов
/ 25 августа 2009

Я использую cvs2svn для конвертации своего хранилища. Я сделал это с успехом в одном репозитории, и теперь моя новая проблема - второй репозиторий.

В моем новом преобразовании я хочу преобразовать только ГОЛОВУ и одну ветвь. В cvs2svn есть только функция «исключить» для ветвей, но не «включать». У меня много много филиалов, и исключая каждый из них займет много работы ....

есть ли способ конвертировать только транк (HEAD) и только одну ветку?

спасибо, Одед

Ответы [ 2 ]

1 голос
/ 25 августа 2009

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

cvs2svn --force-branch=mybranch --exclude='.*' ...

Если вы хотите включить не только ветку, но и как можно больше тегов, то это немного сложнее. Мало того, что вы не обязательно знаете имена всех тегов, но вы также не можете включать теги, которые зависят от исключенных ветвей. В этом случае проще всего работать с опциями --write-symbol-info и --symbol-hints:

cvs2svn --write-symbol-info=symbol-info.out --passes=1:3 ...

Это создаст файл с именем «symbol-info.out», содержащий информацию обо всех символах CVS. В вашем редакторе откройте этот файл, найдите все строки, соответствующие ветвям, которые вы хотите исключить, и измените третий столбец этих строк на слово «исключить». Убедитесь, что в третьем столбце строки для ветви, которую вы хотите включить, содержится слово «ветка», а в четвертом столбце указан путь, по которому вы хотите, чтобы он заканчивался.

Теперь снова запустите cvs2svn, начиная с этапа 3 и используя отредактированный файл информации о символах в качестве файла подсказок о символах:

cvs2svn --symbol-hints=symbol-info.out --passes=3 ...

вы получите много ошибок, таких как:

ERROR: ExcludedSymbol('FOO_BRANCH') cannot be excluded because the following symbols depend on it:
    BAR_TAG
    BAZ_TAG

Теперь вернитесь в редактор и измените перечисленные теги (BAR_TAG и BAZ_TAG в примере), чтобы они тоже были исключены, затем попробуйте снова запустить pass3. Эту процедуру, возможно, придется повторить пару раз, но она не должна быть громоздкой, поскольку pass3 выполняется очень быстро.

Когда вы получили pass3 для завершения без ошибок, запустите остаток преобразования:

cvs2svn --symbol-hints=symbol-info.out --passes=4: ...
1 голос
/ 25 августа 2009

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

IOW, cvs2svn на самом деле не поддерживает это. Вы можете обойти, отредактировав его исходный код. В cvs2svn_lib.symbol_strategy.BranchIfCommits измените регистр, в котором он возвращает Branch (символ), на

   if symbol.name == 'my_branch':
       return Branch(symbol)
   else:
       return ExcludedSymbol(symbol)

IIUC, BranchIfCommits следует использовать по умолчанию.

Лично я бы использовал другую стратегию:

 1. convert the repository once, with all branches.
 2. do a "svn ls" on branches, and redirect that into a file.
 3. edit the file to construct an exclude regex out of it, of the form `b1|b2|...|bn`

Я бы не назвал это МНОГО работы ...

...