Мы поддерживаем веб-приложение, которое имеет общую главную ветвь и множество параллельных ветвей, по одной для каждой установки, каждая из которых имеет несколько конкретных изменений. Исходный код управляется в git, и это отличный инструмент, когда нам нужно перенести функции и исправления из основной ветки в параллельные. Но мало файлов, которые являются конфиденциальными, и автоматическое слияние обычно дает плохие результаты. Таким образом, слияние было бы намного проще, если бы их можно было как-то пометить, и каждое слияние привело бы к конфликту, требующему слияния вручную.
Я искал ответ:
- Я использую параметры слияния --no-commit и --no-ff , но это не одно и то же.
- Здесь и здесь кто-то задает тот же вопрос, но без решения.
- Похожий случай, похоже, заключается в том, как предотвратить слияние файлов с использованием .gitattributes, содержащих: somefile.php merge = ours . Я попытался найти какой-нибудь вариант слияния, который мог бы вызвать конфликт или принудительное слияние вручную, но пока не нашел.
- .gitattributes, содержащие: somefile.php -merge , никогда не объединяются автоматически, поэтому принудительное объединение выполняется вручную. Это 90% -ное решение, но я стремлюсь попробовать автоматическое слияние и пометить его как конфликт независимо от того, успешно оно или нет.Но это пока что ближе всего к решению. (... спасибо Чарльзу Бейли за разъяснения ...)
- Кто-то предлагает написать собственный драйвер слияния ( 1 , 2 ), но как это сделать, мне далеко не ясно.
редактировать: вариант 4. описание
git fetch
сначала делаю , а затем используюgit difftool <file> FETCH_HEAD
, поэтому я могу вручную применить изменение в удаленной ветке к локальному.-merge
не мешает вам объединять файлы, она просто заставляет вас делать это вручную, например, с помощью mergetool. Разве это не то, что тебе нужно?-merge
in.gitatttributes
git merge
ничего не делает, и вся работа должна быть прекращена с помощью инструмента слияния? Итак, нет <<<<< ===== >>>> для использования инструмента слияния, верно? И решение Дэна это обеспечивает?Ответы:
Вариант 5, настраиваемый драйвер слияния, вероятно, является наиболее близким к тому, что вы хотите. Сделать это на удивление легко. Ниже приведен пример того, что, как мне кажется, должно подвести вас к желаемому поведению.
Сначала создайте сценарий драйвера слияния с именем
merge-and-verify-driver
. Сделайте его исполняемым и поместите в подходящее место (вы можете рассмотреть возможность проверки этого скрипта в репо, даже если от него будет зависеть конфигурационный файл репо). Git выполнит этот сценарий оболочки, чтобы выполнить слияние конфиденциальных файлов:Это просто стандартное поведение слияния, которое обычно делает сам Git. Ключевое отличие состоит в том, что сценарий всегда возвращает ненулевое значение (чтобы указать, что произошел конфликт, даже если слияние было фактически разрешено без конфликтов).
Затем вам нужно сообщить Git о существовании вашего настраиваемого драйвера слияния. Вы делаете это в файле конфигурации репозитория (
.git/config
):В этом примере я поместил
merge-and-verify-driver
каталог верхнего уровня репо (./
). Вам нужно будет указать путь к сценарию соответственно.Теперь вам просто нужно присвоить конфиденциальным файлам правильные атрибуты, чтобы при слиянии этих файлов использовался настраиваемый драйвер слияния. Добавьте это в свой
.gitattributes
файл:Здесь я сказал Git, что любой файл с именем, соответствующим шаблону,
*.sensitive
должен использовать специальный драйвер слияния. Очевидно, вам нужно использовать шаблон, подходящий для вашего файла (ов).источник
Эти две команды, похоже, имеют тот же эффект, что и использование настраиваемого драйвера слияния:
Первая команда останавливает слияние до создания коммита слияния, а вторая помечает все файлы, измененные в двух ветвях, как конфликт, который необходимо разрешить, даже если изначально конфликта не было.
источник
Примечание: эта статья « Написание драйвера слияния git для файлов PO » иллюстрирует вид манипуляций, которые вы можете выполнять при слиянии файла вручную: вы можете предварительно обработать его, чтобы при ручном слиянии были готовы определенные данные.
git merge-file
может использоваться, например, для РАСШИФРОВКИ (и повторного шифрования) файлов перед объединением (!)В вашем случае выход из вашего драйвера слияния со статусом, отличным от 0, гарантирует, что слияние будет ручным.
источник