Git-как заставить конфликт слияния и ручное слияние для выбранного файла
мы поддерживаем веб-приложение, которое имеет общую главную ветвь и множество параллельных ветвей, по одной для каждой установки, каждая из которых имеет несколько конкретных изменений. Исходный код управляется в git, и это потрясающий инструмент, когда нам нужно передать функции и исправления ошибок из главной ветви в параллельные. Но есть несколько файлов, которые являются чувствительными и автоматическое слияние, как правило, дают плохие результаты. Поэтому слияние было бы намного проще, если бы их можно было как-то отметить, и каждое слияние привело бы к конфликту, требующему ручное слияние.
Я искал ответ:
- я использую -- no-commit и -- no-ff функции объединить, но это не то же самое.
здесь и здесь кто-то задает тот же вопрос, но без решения.- похоже, что подобный случай заключается в том, как предотвратить слияние файлов с помощью .gitattributes по, содержащая: какой-то файл.php merge=ours . Я попытался найти какой-то вариант слияния что приведет к конфликту или принудительному ручному слиянию, но пока не найдено.
- .gitattributes по, содержащая: какой-то файл.php-merge никогда не сливается автоматически и, следовательно, принудительное ручное слияние. Это 90% решение, но то, что я ищу, это попробовать автоматическое слияние и отметить его как конфликт, независимо от того, успешно это или нет. но это пока ближе к решению.(...спасибо Чарльзу Бейли за разъяснение...)
- кто-то предлагает для записи пользовательского драйвера слияния (1,2), но как это сделать мне далеко не ясно.
edit: вариант 4. описание
3 ответов:
Вариант 5, пользовательский драйвер слияния, вероятно, является способом приблизиться к тому, что вы хотите. Это удивительно легко сделать. Ниже приведен пример того, что я думаю, должно привести вас довольно близко к желаемому поведению.
во-первых, создайте сценарий драйвера слияния под названием
merge-and-verify-driver. Сделайте его исполняемым и поместите его в подходящее место (вы можете рассмотреть возможность проверки этого скрипта в репо, даже, поскольку файл конфигурации РЕПО будет зависеть от него). Мерзавец собирается выполнять этот сценарий оболочки для выполнения слияния конфиденциальных файлов:#!/bin/bash git merge-file "" "" "" 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в каталоге верхнего уровня РЕПО (./). Вам нужно будет указать путь к скрипту соответственно.теперь вам просто нужно дать чувствительным файлам соответствующие атрибуты, чтобы при слиянии этих файлов использовался пользовательский драйвер слияния. Добавьте это к вашему
.gitattributesfile:*.sensitive merge=verifyвот, я сказал Git, что любой файл с именем, соответствующим шаблону
*.sensitiveследует использовать пользовательское слияние водитель. Очевидно, что вам нужно использовать шаблон, который подходит для вашего файла(ов).
Примечание: эта статья "написание драйвера слияния git для PO-файлов" иллюстрирует вид манипуляции, которую вы можете сделать при ручном слиянии файла: вы можете предварительно обработать его, чтобы ваше ручное слияние было готово к определенным данным.
git merge-fileможно использовать, например, для расшифровать (и повторно зашифровать) файлы перед слиянием (!)в вашем случае выход из драйвера слияния со статусом, отличным от 0, гарантирует, что слияние будет одно руководство.
эти две команды, похоже, имеют тот же эффект, что и при использовании пользовательского драйвера слияния:
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)первая команда останавливает слияние перед созданием фиксации слияния, а вторая отмечает все файлы, измененные в двух ветвях, как конфликт для решения, даже если изначально не было конфликта.
Comments