cvs2svn и информация о слиянии
Я хочу преобразовать проект CVS в Subversion, используя cvs2svn. Он имеет основной ствол (HEAD) с несколькими временными ветвями разработки, созданными из ствола.
Перед тем, как конвертировать его, мы объединяем последние изменения из ствола во все ветви dev. Но они также будут иметь изменения, которые еще не были объединены в багажник.
Когда я преобразую проект в SVN, он не будет иметь никаких свойств истории слияния. Итак, как я могу инициализировать эти свойства, чтобы впоследствии я мог объединяться с ветками?
Другими словами, после преобразования будет существовать ряд различий между стволом и любой данной ветвью. В следующий раз, когда я сливаюсь из магистрали в ветку, я не хочу рассматривать эти различия как изменения, которые необходимо объединить. Но когда я сливаюсь с ветки в ствол, я делаю. Это возможно?
ОБНОВЛЕНИЕ: Я принял предложение Мхаггера и сказал SVN, что в ветвях все изменения уже объединены из магистрали:
svn co [branch URL] .
svn merge --record-only [trunk URL]
svn commit -m ''
Это работает, поэтому в следующий раз, когда я попытаюсь слиться из ствола в ветку, он не показывает новых изменений.
Но у меня все еще есть проблема с --reintegrate merges, от ветки до ствола. В конечном итоге он отображает множество файлов с буквой "R", что означает, что в стволе есть файл X, а в ветви - файл X, но они не считаются одним и тем же файлом. Это делает слияние немного запутанным, хотя, похоже, в итоге получается правильный результат.
Я думаю, что это происходит из-за следующей последовательности событий:
- Филиал создан (в CVS)
- Файл X был добавлен в ствол (в CVS)
- X был объединен с веткой (также в CVS)
- Проект был преобразован в Subversion
- Subversion не знала, что ветка /X была скопирована из транка /X. Так что думает, что это замена.
История SVN выглядит примерно так:
r100: create branch (copied from trunk)
r200: add trunk/X
r300: add branch/X (because of a CVS merge, but it's not a SVN copy)
Итак, есть ли способ сказать мне, что Subversion игнорирует происхождение файлов при выполнении слияния --reintegrate? Или лучший способ конвертировать эти файлы?
2 ответа
Хорошо, я думаю, что у меня есть обходной путь для проблемы --reintegrate выше, на случай, если кому-то будет интересно.
Согласно этому документу, если я слил последнюю версию транка в ветвь, выполнение --reintegrate по сути аналогично выполнению этого с транком:
svn merge [trunk URL] [branch URL]
Но этот синтаксис допускает --ignore-ancestry, а --reintegrate - нет. Так что я могу сделать:
svn merge --ignore-ancestry [trunk URL] [branch URL]
Это показывает мне те же результаты, что и --reintegrate, без всех файлов с "R". Единственное другое отличие - это свойства mergeinfo. Я не уверен, что они будут правильными, поэтому, вероятно, лучше потом удалить ветку, как вы это сделали бы после --reintegrate.
Как вы, вероятно, знаете, cvs2svn не генерирует метаданные слияния, за исключением неявной информации о том, откуда произошли ветви. (Это невозможно, потому что CVS не записывает такую информацию.) Таким образом, после преобразования вам придется явно сообщить Subversion о слияниях, которые были сделаны в CVS.
Самый простой способ сделать это с помощью "svn merge --record-only ...
", как описано в книге Subversion.