Могу ли я настроить, как Git обнаруживает конфликты слияния - PullRequest
0 голосов
/ 01 марта 2019

У меня есть инструмент, который может сравнивать и объединять двоичные файлы.Он также может попытаться автоматически объединить указанные двоичные файлы и прервать работу, если есть изменения, которые нельзя принять без вмешательства человека.Можно ли настроить git для использования моего инструмента, чтобы определить, приводит ли слияние к конфликту слияния?

Например, предположим, что он может работать с .png-файлами.Если у меня есть две ветви A и B и в ветви A были изменения в пикселе в [150,100], а в ветви B были изменения в пикселе в [200, 50].Если я теперь объединю ветвь B с веткой A, мой инструмент обнаружит, что нет конфликтующих изменений, и просто автоматически объединит изображение, не вызывая конфликта.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

TL; DR: вы хотите драйвер слияния , который вы объявляете для определенных файлов в .gitattributes.(Сам драйвер настраивается в .git/config. См. документацию по gitattributes .)

Вы не можете настроить то, как Git решает , что некоторый файл должен быть объединен.Алгоритм принятия решения слишком прост для этого, поскольку он состоит из:

  1. Определите три файла в базовом коммите слияния и двух сторонах (левой и правой, или нашей и их).

    То есть предположим, что в базе слияния есть файл с именем path/to/abc.png, а на двух сторонах также есть файлы с именем path/to/abc.png.Git предполагает, что все три имени представляют один и тот же базовый файл.

    Если, скажем, правая (--theirs) сторона не имеет path/to/abc.png,но имеет different/path/to/xyz.png и , что файл кажется вновь созданным (не существует в базе слияния) и содержимое xyz.pngGit может достаточно идентифицировать их xyz.png с abc.png базы, но теперь правая сторона имеет изменение имени , а также потенциальный контент.разница.Это - переименование файла - это изменение high level .

    Аналогично, если одна сторона полностью удаляет файл , это также изменение высокого уровня.(Если обе стороны полностью удаляют файл, то здесь нет никаких проблем: результатом слияния является просто «удалить файл».) Решение о том, что одна или обе стороны удалили файл, возникает из-за отсутствия несопоставленного файла (такой как этот недавно созданный xyz.png), который выглядит достаточно похожим.

  2. Теперь, когда мы / Git определили эти три файла как "одинаковые", требуется нетривиальное слияниеесли выполняется одно из следующих условий:

    • И левая, и правая стороны изменили содержимое на другое.Таким образом, хэши большого двоичного объекта в левой и правой сторонних коммитах для файла отличаются и , оба отличаются от хэша большого базового коммита.Обратите внимание, что это еще не означает, что существует конфликт ! Это просто означает, что требуется объединение.

    • Или, по крайней мере, одна сторона изменила содержимое, и другая сторона внесла изменения high level , такие как переименование или удаление файла.Это автоматически конфликт высокого уровня .

Если конфликт, обнаруженный в этой точке, является конфликтом высокого уровня , Git остановится и получит помощь.Тем не менее, он может сначала запустить драйвер слияния для трех входных файлов, если это необходимо.

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

  • на самом деле существует три файла (ни один из трех не пропущен или не удален), а
  • хэши больших двоичных объектов для всех трех различаются.

Низкоуровневый драйвер слияния - это драйвер, настроенный вами в файле .gitattributes.Если вы не настроили один через .gitattributes, это либо встроенный драйвер слияния текстовых файлов, либо встроенный драйвер слияния двоичных файлов.

Встроенный драйвер слияния текстовых файлов пытается объединить измененияиспользуя обычный метод diff-and-stick-merge-конфликта-markers-in.Если возникает конфликт, который не удается разрешить низкоуровневому драйверу текстового слияния, Git остановится и получит помощь.

Встроенный драйвер слияния двоичных файлов просто объявляет сбой.Git остановится и получит помощь.

Если вы предоставите свой собственный драйвер слияния, вы несете ответственность за получение правильного результата слияния и / или указание Git прекратить иполучить помощь.Поэтому, если у вас есть драйвер слияния, который знает, как объединять файлы .png, вы можете установить его как драйвер слияния низкого уровня для *.png.

0 голосов
/ 01 марта 2019

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

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

В общем, однако, вам следует избегать контроля версий бинарных файлов в Git, потому что это нехорошо обрабатывать двоичный контент.

...