SVN - Управление частичным слиянием ревизии

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

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

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

Rev 20
  A./project_foo
  A./project_foo/not_required_file.txt

Rev 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 и, таким образом, столкнулся с конфликтами деревьев на нем (из дальнейших изменений, которые я сделал позже).

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

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

Спасибо.

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Надеюсь, что часть этого будет полезна.

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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