Подтвердить что ты не робот

Как управлять параллельным развитием с помощью ртути?

Это вопрос наилучшей практики, и я ожидаю, что ответ будет "это зависит". Я просто надеюсь узнать больше реальных сценариев и рабочих процессов.

Прежде всего, я говорю о разных изменениях для одного и того же проекта, поэтому нет подрепо.

Скажем, у вас есть база кода в репозитории hg. Вы начинаете работать над сложной новой функцией A, тогда сложный баг B сообщается вашим доверенным тестером (у вас есть тестеры, верно?).

Это тривиально, если (исправление для) B зависит от A. Вы просто используете ci A, а затем ci B.

Мой вопрос заключается в том, что делать, когда они независимы (или, по крайней мере, сейчас).

Я могу думать о следующих путях:

  • Используйте отдельный клон для B.
  • Использовать анонимные или именованные ветки или закладки в том же репозитории.
  • Используйте MQ (с патчем B поверх A).
  • Используйте разветвленную MQ (я объясню позже).
  • Используйте несколько MQ (начиная с версии 1.6)

1 и 2 покрываются отличный блог от @Steve Losh, связанного с слегка связанные вопросы.

Одно огромное преимущество 1 по сравнению с другими вариантами заключается в том, что он не требует каких-либо перестроек, когда вы переключаетесь с работы на одну вещь на другую, потому что файлы физически разделены и независимы. Таким образом, это действительно единственный выбор, если, например, A и/или B затрагивает заголовочный файл, который определяет трехуровневое логическое значение и включается тысячами C файлов (не говорите мне, что вы не видели такой унаследованный код основание).

3, вероятно, самый простой (с точки зрения настройки и накладных расходов), и вы можете перевернуть порядок A и B, если B - небольшое и/или срочное решение. Однако может оказаться сложным, если A и B касается одного и того же файла (ов). Легко исправить патч-хаки, которые не применимы, если изменения A и B ортогональны внутри одного и того же файла (ов), но концептуально это все еще немного рискованно.

4 может сделать вас головокружение, но это самый мощный и гибкий и масштабируемый способ. Я по умолчанию hg qinit с -c, так как я хочу отмечать незавершенные исправления и нажимать/вытаскивать их, но для этого требуется концептуальный скачок, чтобы понять, что вы можете также встраиваться в репит MQ. Вот шаги (mq = hg -mq):

  • hg qnew bugA; внести изменения для A; hg qref
  • mq branch branchA; hg qci
  • hg qpop; mq up -rtip^
  • hg qnew bugB; внести изменения для B; hg qref
  • mq branch branchB; hg qci
  • Чтобы снова работать с A: hg qpop; mq up branchA; hg qpush

Кажется сумасшедшим сделать так много шагов, и всякий раз, когда вам нужно переключать работу, вы должны hg qci; hg qpop; mq up <branch>; hg qpush. Но учтите следующее: в одном репозитории есть несколько названных ветвей релиза, и вам нужно одновременно работать над несколькими проектами и исправлениями ошибок для всех (вам лучше получить гарантированный бонус за такую ​​работу). Вы бы очень скоро потерялись с другими подходами.

Теперь мои друзья-любители hg, есть ли другие/лучшие альтернативы?


(ОБНОВЛЕНИЕ) qqueue почти делает # 4 устаревшим. См. Стихотворное описание Стива Лоша здесь.

4b9b3361

Ответ 1

Кажется, что нет больше или лучше, чем те, которые я перечислял в вопросе. Итак, вот они снова.

  • Используйте один клон для каждого проекта.
    • Плюсы: полное разделение, поэтому при переключении проектов не восстанавливается.
    • Минусы: toolchain должен переключаться между двумя клонов.
  • Использовать анонимные или именованные ветки или закладки в том же репозитории.
    • Плюсы: стандартная hg (или любая DVCS) практика; чистый и понятный.
    • Минусы: необходимо зафиксировать перед переключением и восстановлением после.
  • Используйте MQ с одним патчем (или несколькими последовательными исправлениями) для каждого проекта.
    • Плюсы: простые и легкие.
    • Минусы: обязательно qrefresh перед переключением и восстановлением после; сложно и рискованно, если проекты не ортогональны.
  • Используйте один ветвь MQ (или qqueue в версии 1.6+) для каждого проекта.
    • Плюсы: ультра гибкие и масштабируемые (для количества параллельных проектов)
    • Минусы: должны qrefresh и qcommit перед переключением и восстановлением после; чувствует себя сложным.

Как всегда, нет серебряной пули, поэтому выберите и выберите подходящую для работы.


(ОБНОВЛЕНИЕ) Для всех, кто любит MQ, использование MQ поверх обычных ветвей (# 2 + # 3), вероятно, является наиболее распространенной и предпочтительной практикой.

Если у вас есть два параллельных проекта с базовым уровнем на двух ветвях (например, следующая версия и текущий выпуск), тривиально переходить между ними следующим образом:

hg qnew; {coding}; hg qrefresh; {repeat}
hg qfinish -a
hg update -r <branch/bookmark/rev>
hg qimport -r <rev>; {repeat}

Для последнего шага qimport следует добавить параметр -a, чтобы сразу импортировать строку изменений. Я надеюсь, Майстер Гейслер замечает это:)

Ответ 2

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

  • В вашем проекте отсутствует процесс сборки, чтобы вы могли тестировать и запускать все прямо из исходного кода? Тогда у меня возникнет соблазн иметь только один клон и hg up назад и вперед, когда мне нужно будет работать в другой ветке.

  • Но если у вас есть построение, virtualenv или другая структура, которая создается, и которая может расходиться между двумя ветвями, то выполнение hg up, ожидающее повторного запуска процесса сборки, может быть большая боль, особенно если такие вещи, как создание примерной базы данных, задействованы. В этом случае я определенно использовал бы два клона, один сидящий на кончике туловища, и один, сидящий на кончике ветки аварийной функции.

Ответ 3

Итак, вопрос в том, когда вам говорят прекратить работу над функцией A и начать независимую функцию B, какие альтернативные варианты существуют, для: Как управлять параллельной разработкой с помощью меркуриального?

Посмотрите на проблему с удалением concurrency, так же, как вы пишете многопоточный код, - определите простой рабочий поток для решения любой заданной вами проблемы и примените ее к каждой проблеме. Mercurial присоединится к работе, как только это будет сделано. Итак, программист A будет работать над функцией A. Программист B будет работать над функцией B. Оба просто вы сами. (Если бы у нас были многоядерные мозги:)

Я бы всегда использовал именованные ветки, потому что это позволяет Mercurial выполнять свою работу: сохранять историю проекта и помнить, почему вы вносили изменения в какой-то порядок в исходный код.

Я согласен с настроением Брэндона, но мне интересно, не упустил ли он, что функция A не была проверена? В худшем случае код компилирует и передает модульные тесты , но некоторые методы реализуют предыдущие требования, а некоторые методы реализуют новые.. Разница с предыдущей регистрацией - это инструмент, который я бы использовал чтобы помочь мне вернуться в нужное русло с функцией A.

Является ли ваш код для функции A в момент, когда вы обычно проверяете его? Переключение с функции A на работу с функцией B не является основанием для фиксации кода в голове или в ветки, Проверяйте только код, который компилирует и передает ваши тесты. Моя причина в том, что если программисту C необходимо начинать функцию C, новая проверка этой ветки перестает быть лучшим местом для начала. Сохраняя здоровье ваших ветвей ветки, вы можете быстро реагировать, с более надежными исправления ошибок.

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

Для меня имеет смысл только ваш вариант 1. В общем:

  • Вам следует подумать, что ваш код работает, прежде чем кто-то его увидит.
  • Благоволите голову над веткой.
  • Отправка и регистрация, если кто-то еще поднимает проблему.
  • Если ваша автоматическая система или тестеры нуждаются только в вашем коде.
  • Филиал, если вы являетесь частью команды, работая над проблемой. Рассмотрим его главу, см. 1-4.

За исключением файлов конфигурации, процессы сборки должны быть checkout и командой single build. Переключение между клонами не должно быть сложнее, чем для нового программиста присоединиться к проекту. (Я признаю, что мой проект нуждается в некоторой работе здесь.)