Вопрос

Я использую cvs2svn для преобразования своего репозитория.Я успешно сделал это в одном репозитории, и теперь моя новая проблема — второй репозиторий.

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

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

Спасибо, Од

Это было полезно?

Решение

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

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: ...

Другие советы

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

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

   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`

Я бы не назвал это большим трудом...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top