2009-08-25 6 views
2

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

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

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

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

ответ

1

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

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

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

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

Это создаст файл под названием «Символ-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: ... 
+0

Вариант, о котором вы упоминали - ветвь -force, не работает. ОДНАКО, второй вариант с символьной информацией работает отлично! Спасибо! – Oded

1

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

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

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` 

Я бы не назвал, что много работы ...

+0

я видел где-то вариант написания --froce-филиальную = NAME --exclude = * , что ты думаешь? – Oded

+0

Я не думаю, что это сработает. Если я правильно прочитал код, они оцениваются слева направо, поэтому ветвь сначала включается, а затем исключается. Тем не менее, это может работать, чтобы передать варианты в обратном порядке. –