Слияние с дочерней веткой вызывает удаление нового содержимого дочерней ветки в TFVC, как это исправить? - PullRequest
0 голосов
/ 29 декабря 2011

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

В поддереве database есть каталог patch с (в большинстве ветвей) единственным дочерним каталогом. Этот каталог имеет имя vCurrent (например, если vCurrent равен 2.3 SP1 HF0, тогда каталог исправлений будет называться 2.3 SP1 HF0) и содержит исправления, которые обновят схему базы данных (возможно, с преобразованием данных) с vCurrent до vFeature. vFeature, здесь - версия, в которой рассматриваемая ветвь идет в производство; это может быть vNext, vFuture или (в крайних случаях) vNever, если разработка по какой-то причине не удалась. Обычно ветви функций не имеют целевой версии выпуска, но могут иметь целевую дату выпуска.

Следовательно, структура выглядит примерно так:

main
    database
        patch
            2.3 SP1 HF0 <--- indicating that "main" is at version 2.3 SP1 HF0
projectgroup1
    main
        database
            patch
                2.3 SP1 HF0
    project1
        main
            database
                patch
                    2.3 SP1 HF0
        feature1
            database
                patch
                    2.3 SP1 HF0

Теперь представьте, что в работе обнаружена критическая ошибка, которая требует немедленного исправления, в результате чего main до версии 2.3 SP1 HF1. Или руководство решает выпустить релиз (возможно, только с одной ветвью функций), чтобы удовлетворить требования рынка, что дает нам 2,4 SP0 HF0. Или что угодно. Патчи "из" 2.3 SP1 HF0, которые не были применены в выпуске, могут или не могут быть применимы, но самое главное, это должно решаться в каждом конкретном случае разработчиком, ответственным за каждую ветку. Таким образом, создается новый каталог патчей с новым номером текущей версии, а старый удаляется, потому что он больше не актуален (он все еще доступен из системы контроля версий, также проверяя «показать удаленные элементы»). как в ветке выпусков релиза, так что доступ к содержимому определенного выпуска не является проблемой). При объединении этого набора изменений со своими соответствующими ветвями функций каждый разработчик должен просматривать свои наборы исправлений базы данных и обновлять их по мере необходимости, чтобы соответствовать любым изменениям схемы, исходящим от восходящего потока.

Обычно это не является большой проблемой, так как изменения в структуре патча вносятся в самый верхний main (что опять-таки стабильно) и стекают вниз.

Однако, , если существует вторая (до выпущенной) ветки функции со своим собственным набором патчей базы данных, TFVC выполнит операцию удаления в каталоге патчей main 2.3 SP1 HF0 main. по-видимому, без учета того факта, что вторая ветвь функции добавила содержимое в удаленный каталог и удалила эти новые исправления вместе с patch\2.3 SP1 HF0. Это явно нежелательно.

На мой взгляд, ситуация в ветви функций 2 является конфликтом: одна сторона слияния говорит об удалении, а другая говорит о новых файлах, которые никогда не были объединены с источником слияния. В этой ситуации TFVC должен отойти в сторону, представить это как конфликт и спросить программиста, который выполняет слияние, что делать. Обратите внимание, что в этом каталоге могут даже находиться файлы с одинаковыми именами, но разным содержимым (это сделано специально). Вместо этого он просто вытаскивает коврик из-под ваших ног, удаляя каталог и все его содержимое сразу.

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

Работая в границах TFS и TFVC (поэтому, пожалуйста, не говорите «используйте Git в режиме DVCS» или тому подобное), Есть ли способ на самом деле представить это как конфликт? Или нам не повезло, и нам просто нужно разобраться с этой ситуацией вручную? Это случается не очень часто, но при большом количестве веток существует риск проскальзывания ошибки.

1 Ответ

0 голосов
/ 03 января 2012

Вы можете использовать как git, так и tfs одновременно. Посмотри git-tfs. Получите лучшее из обоих миров. Самый большой выигрыш в том, что вам больше не придется иметь дело с меньшим количеством слияний. Это суть вашей проблемы. При объединении очень выгодно основывать конфликты на общей основе для обеих сторон конфликта.

В git нет, кстати, режима "dvcs".

Мы делаем агрессивную ветвь для каждой функции. Это или рабочий процесс:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...