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



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



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




  1. я использую -- no-commit и -- no-ff функции объединить, но это не то же самое.


  2. здесь и здесь кто-то задает тот же вопрос, но без решения.

  3. похоже, что подобный случай заключается в том, как предотвратить слияние файлов с помощью .gitattributes по, содержащая: какой-то файл.php merge=ours . Я попытался найти какой-то вариант слияния что приведет к конфликту или принудительному ручному слиянию, но пока не найдено.

  4. .gitattributes по, содержащая: какой-то файл.php-merge никогда не сливается автоматически и, следовательно, принудительное ручное слияние. Это 90% решение, но то, что я ищу, это попробовать автоматическое слияние и отметить его как конфликт, независимо от того, успешно это или нет. но это пока ближе к решению.(...спасибо Чарльзу Бейли за разъяснение...)

  5. кто-то предлагает для записи пользовательского драйвера слияния (1,2), но как это сделать мне далеко не ясно.


edit: вариант 4. описание

652   3  

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 в каталоге верхнего уровня РЕПО (./). Вам нужно будет указать путь к скрипту соответственно.

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

*.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

    Ничего не найдено.