cvs2svn и информация о слиянии
Вопрос
Я хочу преобразовать проект 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 ...
", как описано в книга о подрывной деятельности.