SVN верстка для веб-разработки и улучшения - PullRequest
2 голосов
/ 23 мая 2011

Мы разрабатываем CMS, и она действительно находится в стадии разработки,

branches/cases/#432    (Under Development By Coder X)
branches/cases/#499    (Under Development By Coder Z)

branches/next-release  (Under QA)
  (Pending Merges by X&Z Coders)

tags/was-on-LIVE-before-v1.x

trunk/on-LIVE

Текущая структура, как указано выше, когда мы получили новый случай из вспомогательного программного обеспечения, мы сократили ветвь с branches/next-relase до cases/#CASEIDзатем автоматически создается учетная запись ftp, и веб-хост настраивается для этого разработчика в качестве рабочего пространства на нашем сервере разработки.
Кодер вносит изменения через FTP, а когда он это делает, он фиксирует (также добавляет / возвращает / удаляет) изменения в своей branches/cases/#CASEID части.
После этого у нас на портале для разработчиков появилась кнопка, которая пытается автоматически объединить

При автоматическом объединении:
Мы обновляем branches/next-release (это также демонстрационное место для проверки всех коммитов командой),затем попробуйте:

svn merge --dry-run --reintegrate \
  svn://SVN_SERVER/branches/cases/#CASEID \
  /development/workspaces/next-release | grep "C "

Если мы получим конфликт, мы подробно сформулируем предупреждение для кодировщика, как «что слияние вызовет конфликт при следующем выпуске, поэтому вы должны оформить заказ как на локальном, так и на слияние вручную», если естьнет никакого конфликта devel portal повторно запускает команду слияния без нее и фиксирует изменения на /development/workspaces/next-release.

Некоторые проблемы, с которыми я столкнулся:

  • Пока разработчик сокращаетсяs #432 ответвление от branches/next-release и начатое кодирование внесли много изменений, но продолжают работать, пока он работает
  • какой-то другой разработчик открыл #499 и сделал некоторые изменения с другими файлами и слил сbranches/next-release,
  • тогда, когда "#432 парень" заканчивает свою работу и объединяет свою ветку с branches/on-QA-phase, тогда некоторые изменения, сделанные "#499 парень", теряются / переопределяются #432 старымфайлы.

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

Ответы [ 3 ]

1 голос
/ 23 мая 2011

По сути, всякий раз, когда с SVN связан рабочий процесс реинтеграции, вам необходимо сначала объединить целевую ветвь с вашей локальной ветвью, , а затем реинтегрировать указанную локальную ветвь обратно в ветвь интеграции.
Смотрите " реинтегрировать рабочий процесс".

Одной из проблем, с которой вы столкнетесь при таком типе рабочего процесса, является «последний» аспект этой операции «реинтеграции», означающий, что после реинтеграции вы не сможете вносить дополнительные изменения в деловетвь (и реинтеграция снова).
Кроме того, тщательно управляйте вашими mergeinfo метаданными .

0 голосов
/ 20 июня 2011

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

Примечание: $ SVN_REPOS - это переменная среды, содержащая URL-адрес нашего хранилища Subversion.

Создана новая ветвь разработки дляразработчик из HEAD ветки релиза:

svn copy $SVN_REPOS/branches/release_branch $SVN_REPOS/branches/development_branch

Разработчик проверяет свою ветку разработки и внедряет их исправления / функции в рабочей области ветки разработки - предпочтительно часто фиксируя в хранилище.

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

  • Для объединения из ветки релиза используется чистая рабочая область development_branch, т.е. все изменения исправлений / функций были зафиксированы.Наличие чистой рабочей области позволяет избежать любого конфликта слияния с незафиксированным кодом.
  • Слияние из ветви выпуска происходит в корне дерева каталогов рабочей области.Это позволяет избежать рабочей области со смешанными ревизиями и гарантирует, что свойство Subversion svn: mergeinfo записывается в верхней части дерева кода ветки разработки.
  • Разработчики обучены понимать, что они интегрируют код других людей на этом этапе,и поэтому они должны тщательно рассмотреть разрешение конфликта.Это лучшая страна для потери изменений других разработчиков, если разрешение конфликтов решается по-быстрому.Хорошая вики-страница, описывающая шаги по разрешению конфликтов и типичные сценарии, также является хорошей идеей.
  • Изменения, объединенные из ветки релиза, фиксируются без внесения каких-либо других исправлений / изменений функций.Это гарантирует, что мы получим один ревизионный коммит, содержащий только изменения, слитые из ветки релиза, у нас также есть стандартный комментарий коммита, который должен использоваться для этого коммита - «Обновление ветки разработчика из release_branch».Эта единственная фиксация «только слияние изменений» также позволяет легко отменить слияние, если что-то пойдет не так, без потери каких-либо функциональных изменений.

Сделав свои функциональные изменения и обновив ветку разработки, разработчик теперь просит объединить их изменения с веткой выпуска.У нас есть конкретный человек, который следит за веткой релиза и выполняет все слияния из веток разработки.Они извлекут свежую копию ветки релиза и выполнят слияние реинтеграции из ветки разработки в рабочую область ветки релиза.Как и во всех наших слияниях, это происходит в корне дерева кода.Любые конфликты отправляются обратно разработчику, без каких-либо обязательств в ветке релиза.Разработчик должен будет обновить свою ветку разработки из ветки релиза и разрешить конфликты, прежде чем запрашивать другое слияние с веткой релиза. Примечание: Команда svn merge --reintegrate сообщит об ошибке до начала слияния, если ветвь разработки "устарела".

Номер редакции коммита ветки выпуска отмечен, и«блокирующее» слияние добавляется в ветку разработки.Предположим, что в этом примере мы добавили изменения development_branch в ветку релиза в редакции 112. В рабочей области для ветки разработки:

svn merge --record-only -c 112 $SVN_REPOS/branches/release_branch
svn commit --depth=immediates . -m "Block development_branch to release_branch merge revision 112 from being merged back into rel_05_01_001"

Это ключ к долгосрочному развитию отрасли.Когда в следующий раз разработчик обновит свою ветку разработки новыми изменениями в ветке релиза, слияние не повлечет за собой версию 112, которая содержит изменения, уже внесенные в ветку разработки.Это позволяет избежать целого ряда конфликтов.По сути, слияние --record-only заставляет Subversion думать, что ревизия 112 еще не была объединена с веткой разработки, хотя на самом деле это всего лишь маркер, а файлы не были объединены.

Таким образом, мы в основном избегаемпроблемы слияния, потому что мы всегда сливаемся в «чистые» рабочие области и последовательно сливаемся в верхней части дерева кода.Трюк --record-only удобен, так как мы предпочитаем избегать дополнительных затрат на создание отдельной ветки для каждого исправления / функции.Вот хорошая статья о том, как Subversion отслеживает слияния с помощью свойства Subversion mergeinfo:

0 голосов
/ 23 мая 2011

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

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

Интересно, в этом ли проблема - разработчик объединился из магистрали в ветку, но не объединил все ревизии, а только перенес последнюю ревизию в ветку. В таком случае вы ожидаете, что слияние обратно перезапишет пропущенные ревизии - в конце концов, dev woudl сказал слиянию пропустить их (т. Е. Разветвления на r10, кто-то добавляет обороты 11 и 12, dev слияния r12 на разветвление, и затем, когда он слился обратно, система вычислит разность, перезаписав, таким образом, r11 - что он и сказал).

Точно так же, если # 432 парень получает конфликт, пытается разрешить его, сказав системе пропустить те ревизии, которые кто-то осмелился совершить перед ним, тогда да, он «перезапишет» их (на самом деле он не перезаписывает их, это фактически удаляя их - объединяя их, если разработчик сам удалил код)

Другим аспектом, который я могу не получить, является то, что вы переходите с следующего релиза, но ваш вопрос относится к "парню # 432", сливающемуся с ветвями / на QA-фазе. Может ли это быть как-то связано с проблемой?

В блоге Collabnet описывается, что такое реинтеграция и как она работает.

...