Как можно задним числом ветвиться в Subversion или как можно записать возврат объединенного патча - PullRequest
3 голосов
/ 04 сентября 2010

Часть разработки, которую я сделал для проекта, не может быть развернута, и должна была быть выполнена в отдельной ветке.Я объединил изменения в обратном направлении (с помощью черепахового «возврата изменений из этой ревизии» и тщательного редактирования), отменил работу, которая должна была быть в отдельной ветви, и зафиксировал этот обратный патч в стволе.Теперь я хотел бы создать ветку, включающую изменения, которые были отменены в вышеупомянутом патче.Вот что я сделал:

Я создал новую ветку для новой разработки в редакции, предшествовавшей отмене ревизии.

Я слил отмененную ревизию в новую ветку путем объединения диапазонаревизии в черепахе SVN.

Я открыл журнал изменений, выбрал «Включить объединенные ревизии» и «отменить изменения из этой ревизии».Это отменило эти изменения в моей рабочей копии.Это то, что я хотел бы, чтобы филиал был похож.Я совершил эти изменения.Этот коммит перечисляет патч отмены в «включить объединенные ревизии»;Я не верю, что это должно быть сделано;Кажется, здесь есть проблема.Ключ, вероятно, заключается в том, чтобы записать этот патч (обратный квадрат или произведение оригинальных модификаций) таким образом, что subversion не знает о операции, выполненной для его создания.

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

Следующее является желаемым поведением и работает правильно:

Сначала я создал пустой репозиторий с тегами папок, ствола, ветви.В транке я создал файл file.txt с содержанием (rev1):

one
two
three

Затем отредактировал файл на

one
two_edit
three

И зарегистрировался (rev2).Затем я выбрал rev2 в журнале и выбрал отмену изменений из этой ревизии и зарегистрировался (rev3).Теперь файл снова выглядит следующим образом:

one
two
three

Затем я создал ветвь ствола от rev3 до ветвей \ b1 (rev4, was5; этот шаг выполняет оба действия).В филиалах \ b1 файл выглядит следующим образом:

one
two
three

Затем я возвращаю слияние rev2 из транка в ветви / b1, игнорируя происхождение (rev5).Теперь ветка выглядит следующим образом, и теперь совершенно очевидно, что история содержит нечто подобное:

one
two_edit
three

Я редактирую ствол (rev6), чтобы он выглядел следующим образом:

one
two
three
four

Я объединяю все изменения из ствола в ветви / b1 (rev7).ветки / b1 теперь правильно выглядят так:

one
two_edit
three
four

Как это должно работать

Следующее является желаемым поведением и работает правильно, если выделенный курсивом шаг выполняется следующим образом:

Сначала я создал пустой репозиторий с тегами папок, ствола, ветки.В транке я создал файл file.txt с содержанием (rev1):

one
two
three

Затем отредактировал файл на

one
two_edit
three

И зарегистрировался (rev2).Затем я выбрал rev2 в журнале и выбрал отмену изменений из этой ревизии и зарегистрировался (rev3).Теперь файл снова выглядит следующим образом:

one
two
three

Затем я создал ветку ствола от rev2 до ветви \ b1 (rev4).В филиалах \ b1 файл выглядит так:

one
two_edit
three

Затем я объединяю rev3 из транка в ветви \ b1 (rev5), теперь ветка выглядит так:

one
two
three

Я редактирую ветвь 3 (rev6) так, как если бы я был на этой точке.Теперь совершенно очевидно, что история содержит нечто подобное:

one
two_edit
three

Я редактирую ствол (rev7), чтобы он выглядел следующим образом:

one
two
three
four

Я объединяю все превращается из ствола в ветви / b1 (rev8).Branch / b1 теперь выглядит так:

one
two_edit
three
four

Как это работает

Ниже приводится фактическое поведение;он работает некорректно, если выполняется курсив, что необходимо из-за сложности обратной ветви.Ошибка находится во второй строке последнего шага.

Сначала я создал пустой репозиторий с тегами папок, ствола, ветви.В транке я создал файл file.txt с содержанием (rev1):

one
two
three

Затем отредактировал файл на

one
two_edit
three

И зарегистрировался (rev2).Затем я выбрал rev2 в журнале и выбрал отмену изменений из этой ревизии и зарегистрировался (rev3).Теперь файл снова выглядит следующим образом:

one
two
three

Затем я создал ветвь ствола от rev2 до отделения \ b1 (rev4).В филиалах \ b1 файл выглядит так:

one
two_edit
three

Затем я объединяю rev3 из транка в ветви \ b1 (rev5), теперь ветка выглядит так:

one
two
three

В ветвях \ b1 я выбрал в журнале rev5, выбрал отмену изменений из этой ревизии и зарегистрировался (rev6).Теперь файл снова выглядит следующим образом:

one
two_edit
three

Я редактирую ствол (rev7), чтобы он выглядел следующим образом:

one
two
three
four

Я объединяю все переходит из ствола в ветки / b1 (rev8).ветки / b1 теперь выглядят так:

one
two
three
four

Ответы [ 3 ]

6 голосов
/ 16 сентября 2010

Проблема, которую вы описали (и ваше решение), довольно распространена.Конечно, было бы разумнее сразу начать разработку изменений "не для жизни" в отдельной ветке, но я знаю, что это не идеальный мир, в котором мы живем, и все меняется;).

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

С другой стороны: я не настолько знаком с черепахой, но я полагаю, что это вызывает вишневую травкуслучай) легче, чем командная строка SVN.Особенно, если у вас есть много отдельных коммитов на выбор.Я бы все еще предпочел CLI для операций слияния, поскольку он часто становится намного понятнее, какого черта я сейчас делаю;)

Я желаю вам бесконфликтных слияний, мой друг;)

Кристоф

repository time chart

1 голос
/ 16 сентября 2010

Ключ, вероятно, заключается в том, чтобы записать этот патч (обратный квадрат или произведение оригинальных модификаций) таким образом, чтобы subversion не знал о операции, выполненной для его создания.

Я думаю, вы говорите о попытке заблокировать отслеживание слияний, иначе mergeinfo, от записи в ветке.Я думаю, что вы можете сделать это, используя svn diff или svn merge --ignore-ancestry.Прочитайте SVN Redbook по Расширенное объединение , в частности Объединение без Mergeinfo и Замечание или игнорирование предков .

Вместо того, чтобы переходить от rev2, оно можетпроще создать ветку от ствола от rev3, а затем применить / зафиксировать изменения от rev1 до rev2 в ветке rev3, используя svn diff или svn merge --ignore-ancestry.

В качестве альтернативы вы можете посмотреть на svn merge --record-only подделать слияние, чтобы заблокировать оборот от будущих слияний , то есть убедить ветку или ствол, что вы уже слили отмену, чтобы оно не применялось снова.

1 голос
/ 04 сентября 2010

В диалоговом окне ветки TortoiseSVN выберите «Конкретная ревизия в хранилище», используйте кнопку ... , чтобы выбрать последнюю ревизию, которую вы хотите иметь в новой ветке.

Продолжитькак обычно при ветвлении.

Я пытался воспроизвести вашу проблему, довольно сложно проследить, что находится в стволе, а что в ветке, но вот как ясделал.

Сначала я создал пустой репозиторий с папками tags, trunk, branchtrunk я создал файл file.txt с содержанием (rev1):

one
two
three

Затем я отредактировал файл в

one
two_edit
three

и зарегистрировался (rev2).Затем я выбрал в журнале rev2, выбрал revert changes from this revision и зарегистрировался (rev3).Теперь файл снова выглядит следующим образом:

one
two
three

Затем я создал ветку trunk с rev2 до branches\b1 (rev4).В branches\b1 файл выглядит следующим образом:

one
two_edit
three

Затем я редактирую файл следующим образом в trunk и проверяю (rev5)

one
two
three
four

Затем объединяю из *От 1039 * до branches\b1, выбирая только rev5 и фиксируйте (rev6).Теперь branches\b1\file.txt выглядит следующим образом

one
two_edit
three
four

Все объединено, как я и ожидал.

Где в этом процессе вам идет "неправильно"?

...