Mercurial: Как объединиться с ручным управлением изменениями и файлами?

Примечание. На описанный здесь сценарий нет ответа в Переполнение стека: полностью ручное слияние Mercurial.

Я объясню свой запрос на примере. Предположим, я запускаю репозиторий Mercurial для разработки автомобиля:

C:\Car$ dir
Car.cpp
Car.h

Я работаю над дизайном автомобиля довольно давно, и репозиторий выглядит так:

r0-r1-...-r100-(default)

В какой-то момент я разветвил default на SolarCarBranch, чтобы параллельно работать над автомобилем на солнечной энергии:

C:\SolarCar$ dir
Car.cpp
Car.h
Solar.cpp
Solar.h

Еще через некоторое время репозиторий выглядит так:

r0-r1-...-r100-...-r200-(default)
            \--r101-...-r201-(SolarCarBranch)

Как объединить SolarCarBranch с по умолчанию?

Обратите внимание на следующие сложности в слиянии, которое я хочу:

  1. Я смогу продолжить работу как с по умолчанию, так и с SolarCarBranch после слияния.
  2. В Car.cpp и Car.h в SolarCarBranch могут быть исправления эффективности использования топлива, которые я хочу сделать по умолчанию, однако мне не нужны все изменения в этих файлах. Итак, я хочу выбрать те изменения, которые я хочу включить в по умолчанию во время слияния (так называемое ручное слияние).
  3. Я не хочу, чтобы Solar.cpp и Solar.h появлялись в по умолчанию. Возможно, мир еще не готов к автомобилям на солнечных батареях. ;-)

Что я узнал:

  1. Это возможно с помощью hg merge SolarCarBranch
  2. Этого можно добиться, установив kdiff3.premerge=False в Mercurial.ini
  3. Я не знаю, как этого добиться, поскольку premerge=False по-прежнему объединяет/копирует Solar.cpp и Solar.h в по умолчанию, не спрашивая моего разрешения.

person Ashwin Nanjappa    schedule 10.03.2010    source источник


Ответы (2)


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

Вот установка:

o  changeset:   3:343d531512a3
|  branch:      solar
|  tag:         tip
|  parent:      1:cb26642f8db5
|  user:        Ry4an Brase <[email protected]>
|  date:        Wed Mar 10 11:16:48 2010 -0600
|  files:       afile
|  description:
|  solar-change
|
|
| @  changeset:   2:c5d14e34db07
| |  parent:      0:56465175b2fc
| |  user:        Ry4an Brase <[email protected]>
| |  date:        Wed Mar 10 11:05:44 2010 -0600
| |  files:       other-main-file
| |  description:
| |  moremain
| |
| |
o |  changeset:   1:cb26642f8db5
|/   branch:      solar
|    user:        Ry4an Brase <[email protected]>
|    date:        Wed Mar 10 11:04:32 2010 -0600
|    files:       solar-only
|    description:
|    solar-initial
|
|
o  changeset:   0:56465175b2fc
   user:        Ry4an Brase <[email protected]>
   date:        Wed Mar 10 11:04:14 2010 -0600
   files:       afile
   description:
   initial

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

Так что hg update default ; hg merge -r solar. Появится инструмент слияния для afile, и мы решаем построчно или по частям, хотим ли мы эти изменения. После сохранения выполните hg stat:

% hg stat
M afile
M solar-only

И мы видим, что Solar-only стоит в очереди на коммит по умолчанию. Просто удалитеif).

% hg rm -f solar-only

Теперь hg stat показывает его как удаленный:

% hg stat
M afile
R solar-only

и когда мы зафиксируем, у нас будет то, что мы хотим в новом наборе изменений.

person Ry4an Brase    schedule 10.03.2010
comment
Удаление этих файлов! Как я это пропустил! Большое спасибо! :-) - person Ashwin Nanjappa; 11.03.2010

Ваше первое условие, чтобы иметь возможность продолжать работу с обеими ветвями, выполняется, просто не закрывая ветвь (что вы делаете с опцией --close-branch для hg commit).

Вы можете выбирать наборы изменений для объединения с помощью расширения Transplant. Это позволит вам выбрать только определенные наборы изменений для объединения с набором по умолчанию.

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

Вы также можете просмотреть флаги параметров internal в документах по конфигурации слияния.

person gavinb    schedule 10.03.2010
comment
похоже, что сбор вишни - это то, что требуется от меня - person jk.; 10.03.2010
comment
В самом деле? Я не думаю, что вишневый сбор необходим. Пока предварительное слияние отключено, вы по-прежнему можете контролировать добавление каждого изменения по частям или построчно. Выбор вишни — это просто сокращение от необходимости вручную отклонять изменения в некоторых csets, но вы всегда можете сказать им «нет». Я бы очень не советовал использовать расширение Transplant, потому что тогда у вас будут одни и те же изменения в вашем репо дважды с двумя разными хэш-идентификаторами. - person Ry4an Brase; 10.03.2010
comment
@ Ry4an Я думал предложить ручную фиксацию, как вы описываете, но transplant казалось проще, когда я писал это. Но ваше объяснение убедило меня, что это лучший вариант, особенно ваше замечание о наличии одного и того же набора изменений с двумя разными хэшами. Поэтому я проголосовал за ваш ответ и предложил ОП принять его. - person gavinb; 11.03.2010