SVN - управление частичным слиянием ревизии - PullRequest
11 голосов
/ 14 января 2010

Так что у меня есть проблема, которая вызывает у меня большое горе в Subverion. Я работаю в ветке, которая должна оставаться активной, пока мой набор функций не будет завершен до повторной интеграции. К сожалению, кое-что, что я выполнил, теперь было признано бизнесом «критически важным», и они хотят, чтобы я выбрал эту функциональность из ветви и вставил ее в ствол, чтобы она могла быть подхвачена QA.

У меня проблема в том, что я разработал функциональность в отдельном каталоге, который я создал, работая над чем-то другим полностью. Поэтому, чтобы объединить оставшийся код, который требуется для моей функциональности, мне сначала нужно создать каталог, который я делал ранее.

Вот ревизии, которые мне нужно дернуть:

Ред. 20
A ./project_foo
A ./project_foo/not_required_file.txt

Ред. 24
A ./project_foo/required_file.txt

Итак, чтобы получить это в багажнике, мне нужно было сделать следующее:

svn merge -r20: 21 -> это возвращает мне каталог, а также not_required_file.txt
svn revert project_foo / not_required_file.txt -> избавиться от файла, который мне не нужен
SVN Merge -R24: 25 -> это дает мне файл, который мне требуется

Который сработал и поместил материал в ствол, который я хотел, НО, когда я был полностью укомплектован и выполнил svn merge --reintegrate, я (очевидно) не получил not_required_file.txt из Revision 20 и, таким образом, столкнулся с конфликтами деревьев на нем (от дальнейших изменений я внес позже).

Так что я ищу несколько советов о том, что делать в этих ситуациях.

  • Есть ли способ объединить только определенные изменения, которые я хочу от конкретной ревизии?
  • Есть ли способ получить изменения, которые я сознательно пропустил, когда я реинтегрировал всю ветку?
  • Могу ли я создать необходимую структуру каталогов в транке, а затем объединить только изменения файла?
  • Могу ли я создать еще одну ветку, переместить туда необходимые изменения, реинтегрировать эту ветку, а затем вытянуть из ствола в исходную ветку?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 16 января 2010

Есть ли способ слияния только в конкретные изменения, которые я хочу от конкретная ревизия?

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

В случае создания / удаления / добавления файла он будет создан во время реинтеграции и избежит конфликта дерева, поскольку требуемая «частичная ревизия» никогда официально не объединялась.

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

Следование вышесказанному предотвращает ваш следующий:

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

Если вы не объединяете частичную ревизию, не будет ничего преднамеренно исключенного, записанного Subversion, и у вас просто должен быть обычный конфликт, чтобы иметь дело с уже скопированной частью.

В вашем случае вы можете сказать Subversion слить эту индивидуальную ревизию снова, выполнив действия, обратные тем, которые вы делали ранее (разрешение конфликта или возврат той части, которую вы изначально хотели, при этом оставив часть, которую вы изначально пропустили), но я не уверен, как это работает, когда слияние уже записано.

В качестве альтернативы, если вы используете TortoiseSVN, вы должны иметь возможность выбрать ревизию в журнале (в вашей ветви функций), щелкнуть правой кнопкой мыши по файлам, которые вам интересны, и которые были изменены как часть этой ревизии, и "показать изменения". как diff ", сохраните это и примените его вручную к соединительной линии (или какой ветви является целью нашей ветви реинтеграции).

Могу ли я создать структуру каталогов Мне нужно в багажник а потом слить поверх только файл меняется?

Попробуйте и посмотрите. В худшем случае вы извлекаете другое рабочее пространство или вручную исправляете содержимое файла (в случае, если он пропускает его)

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

Теперь вы просто ранили мою голову :) Исправить это вручную звучит как для меня меньше работы. Я бы исправил часть, которую вы исключили, на стволе, а затем повторил бы попытку реинтеграции ветви.

Надеюсь, некоторая часть этого полезна.

1 голос
/ 16 января 2010

рекурсивно просто "скопировать svn" отсутствующих папок из ветви в транк.

0 голосов
/ 16 января 2010

Для ваших текущих проблем вы можете взглянуть на SVK, который имеет лучшую поддержку слияний, чем SVN (или в прошлый раз, когда я использовал SVN достаточно сильно, чтобы выполнять слияния): http://svk.bestpractical.com/view/HomePage

Я заметил, что вы упомянули проблему нескольких команд с разными уровнями технических способностей, поэтому SVK на самом деле не лучшее решение. На самом деле я предпочитаю git-svn, а не SVK, так как он обеспечивает аналогичные преимущества (даже лучшее слияние, чем SVN или SVK).

В зависимости от нижнего предела диапазона уровней ваших навыков, SVK может быть достаточно близок к SVN, чтобы справиться с задачей, но он добавляет некоторые дополнительные шаги для внесения изменений, и я не знаю, насколько хорошо это поддерживается в Windows (или , если поддерживается в Windows), или если это проблема в вашей среде.

0 голосов
/ 16 января 2010

Хороший вопрос. : -)

Похоже, ваши ветви немного запутались. У вас есть хорошие идеи, как это решить. Если он работает? Попробуйте, иногда вы никогда не узнаете.

Я думаю, вам не нужно объединять оборот. 21 до 24 в вашем примере. Пропавший каталог все равно будет создан.

Если вы не можете помочь себе с разветвлением / объединением, попробуйте выполнить перемещение файлов вручную (черепаха помогает вам в этом).

В общем, избегайте частичного слияния ревизий. Совершайте чаще, чтобы вы могли собирать вишню более чистым способом.

...