Mercurial: конфигурация TortoiseHg всегда запрашивала ручное разрешение для всех файлов при слиянии.

Мы используем Mercurial через TortoiseHg с «верстаком».

При объединении веток мы часто обнаруживаем, что выбор обновлений по умолчанию (автоматически?) не то, что нам нужно. Мы хотели бы настроить инструмент так, чтобы он всегда запрашивал любую операцию слияния.

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

Если мы обновляем файлы ядра в одной ветке, мы хотели бы выполнить слияние, чтобы получить последние файлы ядра в другой ветке. Однако TortoiseHg по умолчанию делает автоматические обновления, которые нам не нужны.

Примеры:

1) Ветка «1» содержит файл «1.xls», а ветка «2» имеет эквивалент «2.xls», которые хранятся в двоичном виде. Слияние «1» с рабочим каталогом, основанным на «2», приводит к удалению «2.xls» и добавлению «1.xls».

2) Ветка «1» содержит обновленный файл «not_core.c», который имеет эквивалент «not_core.c» в ветке «2». Слияние «1» с рабочим каталогом, основанным на «2», вызывает нежелательное автоматическое обновление «not-core.c» в «2».

3) Ветка «1» содержит обновленные файлы «core1.c» и «core2.c». Слияние «1» с рабочим каталогом, основанным на «2», вызывает автоматическое обновление обоих файлов, когда мы предпочитаем подсказку, позволяющую нам выбрать, будут ли обновлены эти основные файлы. Может быть, нам пока нужен только 'core1.c'.

Я видел ссылку на настройку «mergetool.premerge = false» в mercurial.ini и безуспешно пробовал некоторые варианты этого.

Идеальной настройкой будет запуск графического ручного разрешения для каждого отличающегося файла.

Кто-нибудь может помочь с конфигурацией, поддерживающей описанный функционал?

Спасибо, Ян


person murpia    schedule 17.04.2013    source источник


Ответы (2)


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

Случаи 2 и 3 (неконфликтующие изменения в файлах ранчо) могут быть покрыты (TBT!) отключением автоматического слияния в TortoseHG (Главное меню - File - Settings - Global setting - TortoiseHG - "Авто- разрешение слияний": False /по умолчанию - True/)

Для случая 1 (и других неконтентных изменений - переименования, изменения атрибутов) ситуация хуже и автослияние не играет: слить зеркальную историю изменений из одной ветки в другую, т.е. если в общем родителе у вас только 2.xls, что был удален|переименован в 1.xls в исходной ветке, это изменение будет отражено в целевой.

Вы можете попробовать использовать другой "внутренний" инструмент слияния в таких слияниях (когда вы предпочитаете изменения только из одной ветки - "фиктивное слияние") - internal:local и internal:other. Но - они работают только для измененного контента (опять же!)

Возможно, Сохранить "Мои" или "Их" файлы при объединении из раздела TipsandTricks (вы можете присоединиться к упомянутой команде merge-revert-resolve в новую команду в [псевдонимах] и использовать ее вместо обычного слияния, когда это необходимо)

person Lazy Badger    schedule 17.04.2013
comment
Для случаев 2 и 3 (неконфликтующие изменения) я все еще хочу иметь возможность выбирать, какие файлы будут обновляться из другой ветки. Я получаю автоматические «обновления». Единственный рабочий процесс, который я могу использовать в настоящее время (в рабочей среде TortoiseHg), - это отменить диалоговое окно слияния перед окончательной фиксацией, а затем вручную вернуть ненужные файлы. - person murpia; 18.04.2013
comment
@user2290652 user2290652 - если вы отключите автослияние, вы запустите предварительно настроенный инструмент слияния для каждой пары файлов, существующих в обеих ветвях, и сможете копировать в целевые фрагменты из любого источника. - person Lazy Badger; 18.04.2013
comment
У меня для параметра «Автоматическое разрешение слияния» установлено значение false, но чтение описания этого параметра объясняет, почему это не помогает: ... При значении False все файлы с изменениями на обеих сторонах слияния будут отображаться как конфликтующие... I нужно поднять конфликт, если изменился только файл в ветке, из которой я сливаюсь, поэтому я могу выбрать, принимать ли его. - person murpia; 19.04.2013

Вы можете настроить это, используя разделы merge-patterns и merge-tools файла hgrc. Эта настройка позволила мне принудительно использовать kdiff3 в моем тесте:

[merge-patterns]
** = noautomerge

[merge-tools]
noautomerge.executable = kdiff3
noautomerge.args = $base $local $other -o $output --qall
noautomerge.priority = 1
noautomerge.premerge = False

Это отключит автоматическое предварительное слияние, которое делает Mercurial, и вместо этого запустит kdiff3.

Это будет сделано для всех файлов, но, возможно, вам лучше изменить раздел merge-patterns, чтобы он был немного более конкретным, если это возможно.

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

person Steve Kaye    schedule 17.04.2013
comment
Проблема заключается в том, что Mercurial автоматически обновляет все файлы, которые были изменены в другой ветке (но не конфликтуют). Я предположил, что это означает «предварительное слияние», но тестирование, похоже, не так. - person murpia; 18.04.2013
comment
Я не понял, что вы не хотите никаких изменений из другой ветки без слияния. Мое предложение предотвращает автоматическое слияние файлов, которые были изменены в обеих ветвях (даже если эти изменения тривиальны для слияния). Я не уверен, можете ли вы настроить Mercurial так, чтобы он не принимал изменения файла в другой ветке, если слияние не требуется (слияние не требуется, если вы не изменили его в локальной ветке - это фактически обновление) - person Steve Kaye; 18.04.2013
comment
Извините, если я не сделал это достаточно ясно. Да, я хочу получать запросы на любые изменения из другой ветки, чтобы я мог игнорировать их. Причина этого в том, что разные ветки содержат файлы с одинаковыми именами, но со специфичным для ветки содержимым. Это может быть плохим решением, но так сложилось исторически. Мы хотим сохранить Что может очень хорошо сработать, так это способ пометить файлы, которые игнорируются при слиянии, существует ли такой? (Но не по расширению, а только по полному имени файла). - person murpia; 19.04.2013
comment
Хорошо, я нашел это (stackoverflow.com/a/10883348/2290652), чтобы попробовать. Отчитаюсь... - person murpia; 19.04.2013
comment
ОК, форсирование «internal:xxx» с использованием шаблона слияния по-прежнему не помогает. Я думаю, что основная проблема заключается в том, что изменения файлов, которые я хочу рассматривать как слияния, рассматриваются как обновления в Mercurial и всегда будут применяться. Я также провел несколько предварительных тестов с использованием «Git Extensions» и получил такое же нежелательное поведение. Поскольку я предпочитаю пользовательский интерфейс рабочего места TortoiseHg, я не стал углубляться в его изучение. - person murpia; 19.04.2013