Как добавить новую функцию в центральный репозиторий Mercurial? - PullRequest
2 голосов
/ 08 апреля 2010

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

Как правильно передать мою функцию как единый набор изменений в центральный репо?Я не хочу выдвигать 14 наборов «в процессе» и 1 «объединенный» набор изменений к центральному репо.Я хочу, чтобы другие соавторы в проекте видели только один набор изменений со значительным сообщением о фиксации (например, «Внедренная функция ABC»).

Я новичок в Mercurial и DVCS, поэтому не стесняйтесь давать указания, еслиВы думаете, что я не подхожу к этому правильному пути.

<My own answer>

До сих пор я придумал способ уменьшить 15 наборов изменений до 2 наборов изменений.Предположим, что наборы изменений с 10 по 24 являются наборами изменений в процессе разработки.Я могу 'hg collapse -r 10:24 -m "Implemented feature ABC"' (14 наборов изменений свернулись в 1).Тогда я должен 'hg pull' + 'hg merge' + 'hg commit -m "Merged with most recent changes"'.Но сейчас я застрял с 2 ревизиями.Я больше не могу 'hg collapse', потому что pull / merge / commit нарушил мою последовательность изменений.Конечно, 2 набора изменений лучше, чем 15, но все же, я бы предпочел иметь 1 набор изменений.

</My own answer>

Ответы [ 4 ]

7 голосов
/ 08 апреля 2010

Это дублирующий вопрос, (ответ которого - CollapseExtension, которое вы нашли), но я воспользуюсь возможностью, чтобы попытаться отговорить вас от практики.:)

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

Даже если вы все-таки рухнете, вам определенно следует использовать два набора изменений: функцию и объединение функции.Наборы изменений слияния являются нормой для курса и их не следует избегать.Они имеют некоторую очень важную информацию, а именно их происхождение, и отлично справляются с задачей создания добавленной вами функции, которую можно легко переместить в другое место в дереве, не допуская детали слияния вне функции.подробности.Не пытайтесь избегать их!

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

0 голосов
/ 09 апреля 2010

Я ОП. Я нашел другое решение, используя расширение Mq .

Рабочий процесс будет:


// Clone, enable qinit.
hg clone …
hg qinit -c

// Create new queue
hg qnew -m "Implement feature ABC" FeatureABC

// Work and commit to the queue repo
work on feature
hg qrefresh
hg qcommit -m "wip"

// Work and commit to the queue repo
work on feature
hg qrefresh
hg qcommit -m "wip"

// Work and commit to the queue repo
work on feature
hg qrefresh
hg qcommit -m "wip"

// Now, I'm ready to integrate
hg qpop        //remove my patch
hg pull -u     // get changesets form central repo
hg qpush       // reapply patch, 
do some testing and final adjustments
hg qrefresh    //reapply the patch
hg qfinish -a  // freeze the patch changeset

hg push // push to central as a single changeset

Что ты думаешь? Это сложно, но я думаю, что это работает. Из-за сложности я не уверен, что сделаю это, но это вариант.

0 голосов
/ 08 апреля 2010

С расширением rebase см. Hg help rebase, опция --collapse.

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

0 голосов
/ 08 апреля 2010

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

С другой стороны, я где-то прочитал , что клоны дешевы, так что насчет клонированияЕсли вы хотите внедрить функцию, сделайте себе мастер-копию: клонируйте свою мастер-копию в копию функции, внедрите функцию, зафиксируйте и верните клон функции обратно в локальный мастер-клон.

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

Меньшие коммиты также снижают вероятность ошибки кода во время слияний.

...