В Mercurial, как выбрать конкретные файлы из названной ветви, чтобы объединить их с настройками по умолчанию? - PullRequest
7 голосов
/ 29 июня 2010

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

В Git я создал бы другую ветку и раздавил бы все наборы изменений за пределами индекса, затем я добавил бы определенные файлы в индекс и зафиксировал. После этого я мог бы объединить эту временную ветку с master, чтобы master имел чистый коммит только с неразрушающим изменением. Я не знаю, как это сделать с Mercurial.

Ответы [ 3 ]

5 голосов
/ 29 января 2014

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

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

, чтобы получить myfile.c ветвь формы somefeature и заменить версию рабочей копии, выполните:

hg cat path/to/myfile.c -r somefeature > path/to/myfile.c

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

4 голосов
/ 29 июня 2010

Я думаю mercurialqueues - это то, что вы хотите. С mq вы можете превратить любой набор изменений в патч, а любой патч - в набор изменений. Итак, взяв набор изменений, преобразовав его в патч, удалите фрагменты из патча, которые вам не нужны, и затем примените их к любой ветви, которую вы хотите. Это довольно сложная операция, хотя и требует определенной дисциплины с вашей стороны. Поэтому я бы попробовал закрепить ваш рабочий процесс на тестовом репо, прежде чем пробовать его в коде, который вас волнует.

1 голос
/ 29 июня 2010

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

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

hg diff myfile -r startrevision:endrevision

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

Да, и проверяем MercurialQueues .Я не использовал это сам, но я видел, что это делает некоторые сумасшедшие вещи.Может быть, он способен делать что-то в соответствии с тем, что вы хотите.

...