Git - как вызвать конфликт слияния и слияние вручную для выбранного файла - PullRequest
77 голосов
/ 22 февраля 2011

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

Я искал ответ:

  1. Я использую --no-commit и - no-ff опции слияния, но это не одно и то же.
  2. Здесь и здесь кто-то задает тот же вопрос, но без решения.
  3. Похожий случай , как предотвратить слияние файлов , используя .gitattributes, содержащие: somefile.php merge = ours Я попытался найти какую-либо опцию слияния, которая могла бы вызвать конфликт или принудительное ручное слияние, но пока не нашел ни одной.
  4. .gitattributes, содержащие: somefile.php -merge , никогда не сливаются автоматически и поэтому принудительно выполняются вручную.слияния.Это 90% решение, но я пытаюсь попробовать автоматическое слияние и пометить его как конфликтный, независимо от того, успешно он или нет. Но это пока самое близкое решение. (... спасибо Чарльзу Бэйли за разъяснения ...)
  5. Кто-то предлагает написать собственный драйвер слияния ( 1 , 2 ), но как это сделать мне далеко не ясно.

редактировать: вариант 4. описание

Ответы [ 3 ]

56 голосов
/ 23 февраля 2011

Вариант 5, пользовательский драйвер слияния, вероятно, является способом приблизиться к тому, что вы хотите.Это на удивление легко сделать.Ниже приведен пример, который, я думаю, должен приблизить вас к желаемому поведению.

Сначала создайте скрипт драйвера слияния с именем merge-and-verify-driver.Сделайте его исполняемым и поместите его в подходящее место (вы можете рассмотреть возможность включения этого скрипта в репозиторий, даже если от него будет зависеть файл конфигурации репозитория).Git собирается выполнить этот скрипт оболочки, чтобы выполнить слияние чувствительных файлов:

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

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

Далее, вам нужно сообщить Git о существовании вашегопользовательский драйвер слияния.Вы делаете это в конфигурационном файле репо (.git/config):

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

В этом примере я поместил merge-and-verify-driver в каталог верхнего уровня репо (./).Вам нужно будет соответственно указать путь к сценарию.

Теперь вам просто нужно дать чувствительным файлам надлежащие атрибуты, чтобы при объединении этих файлов использовался пользовательский драйвер слияния.Добавьте это к вашему .gitattributes файлу:

*.sensitive merge=verify

Здесь я сказал Git, что любой файл с именем, совпадающим с шаблоном *.sensitive, должен использовать пользовательский драйвер слияния.Очевидно, вам нужно использовать шаблон, который подходит для вашего файла (ов).

0 голосов
/ 14 августа 2018

Кажется, что эти две команды имеют тот же эффект, что и пользовательский драйвер слияния:

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

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

0 голосов
/ 16 ноября 2012

Примечание: эта статья " Написание драйвера git merge для PO-файлов " иллюстрирует вид манипуляции, которую вы можете выполнять при ручном объединении файла: вы можете предварительно обработать его, чтобы выполнить слияние вручную вподготовить определенные данные.

git merge-file можно использовать, например, для УДАЛЕНИЯ (и повторного шифрования) файлов перед объединением (!)

В вашем случае выход из драйвера слияния со статусом, отличным от 0, гарантирует, что слияние будет ручным.

...