Вопрос

Я хочу преобразовать проект CVS в Subversion, используя cvs2svn.У него есть основной ствол (HEAD) с несколькими временными ветвями развития, созданными из ствола.

Прежде чем мы преобразуем его, мы объединим последние изменения из магистрали во все ветви разработки.Но в них также будут изменения, которые еще не были объединены обратно в магистраль.

Когда я преобразую проект в SVN, у него не будет ни одного из свойств истории слияния.Итак, как я могу инициализировать эти свойства, чтобы впоследствии я мог объединяться с ветвями и из них?

Другими словами, после преобразования между магистралью и любой данной ветвью возникнет ряд различий.В следующий раз, когда я выполню слияние из магистрали в ветку, я не хочу видеть эти различия как изменения, которые необходимо объединить.Но когда я сливаюсь с веткой в ствол, я это делаю.Возможно ли это?

Обновить:Я воспользовался предложением mhagger и сообщил SVN, что в ветвях все изменения уже были объединены из магистрали:

svn co [branch URL] .
svn merge --record-only [trunk URL]
svn commit -m ''

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

Но у меня все еще есть проблема с реинтегрированием слияний из ветки обратно в магистраль.В итоге отображается множество файлов, расположенных на "R" местах, что означает, что в магистрали есть файл X, а в ветке есть файл X, но они не считаются одним и тем же файлом.Это делает слияние несколько запутанным, хотя, похоже, в конечном итоге оно приводит к правильным результатам.

Я думаю, что это происходит из-за следующей последовательности событий:

  • Был создан филиал (в резюме)
  • В магистраль был добавлен файл X (в CVS).
  • X был объединен в ветку (также в CVS)
  • Проект был преобразован в Subversion
  • Subversion не знала, что ветка /X была скопирована из trunk / 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, без всех замененных файлов.Единственным другим отличием, по-видимому, являются свойства mergeinfo.Я не уверен, будут ли они правильными, поэтому, вероятно, лучше потом удалить ветку, как вы это делаете после --reintegrate.

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

Как вы, вероятно, знаете, cvs2svn не генерирует никаких метаданных слияния, за исключением неявной информации о том, откуда проросли ветви.(Это невозможно, потому что CVS не записывает такую информацию.) Итак, после преобразования вам нужно будет явно сообщить Subversion о слияниях, которые были выполнены в CVS.

Самый простой способ сделать это - использовать "svn merge --record-only ...", как описано в книга о подрывной деятельности.

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