Автоматическое разрешение Git конфликтов слияния в определенной папке, содержащей автоматически сгенерированный код - PullRequest
0 голосов
/ 23 апреля 2020

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

Причина, по которой я спрашиваю, заключается в том, потому что я работаю над базой кода, которая имеет большую часть автоматически сгенерированного кода. Всякий раз, когда я разрешаю конфликты слияния во время перебазирования, я никогда не пытаюсь вручную слить конфликтующий код в папке, содержащей автоматически сгенерированный код. Я просто пропускаю эти файлы, и после того, как я закончу с ребазом, я регенерирую код, используя наши инструменты. Я просто не доверяю себе правильно слить код, который был сгенерирован инструментом. Это слишком рискованно!

Спасибо за ваш вклад.

1 Ответ

0 голосов
/ 24 апреля 2020

TL; DR: рассмотрим "их" драйвер слияния, такой как этот (это не мое, это довольно тривиально, и на самом деле вам вообще не нужен скрипт оболочки, по крайней мере на Unix -подобных системах). Помните о его ограничениях. Вы можете настроить это с помощью файла .gitattributes и файла конфигурации Git (личная конфигурация --global или один из репозитория). Обратите внимание, что хотя файл .gitattributes включен во все клоны, конфигурация отсутствует, поэтому каждый, кто хочет его использовать, должен настроить команду драйвера.

Long

You может установить драйвер слияния , который берет "свою" копию файла, но здесь есть опасность: ваш драйвер слияния только вызывается в случае конфликта , Вам нужно, чтобы этот драйвер работал со всеми файлами в нужной части репозитория, поскольку Git хранит только файлы (без папок, только файлы с именами, которые содержат косую черту).

Помните, что задача слияния объединить изменения . Когда git merge запускается, он находит три коммита. Средний очень прост, потому что это текущий коммит, а последний очень прост, потому что вы называете его командой git merge. Это первый хитрый: первый коммит, который нужен git merge, это база слияния .

Git находит базу слияния самостоятельно, используя коммит график . Некоторые инструменты просмотра автоматически отображают этот график фиксации (например, gitk и некоторые из более интересных графических интерфейсов); или git log --graph, который вы можете объединить с --oneline, dr aws сырым, но полезным графиком ASCII.

Поскольку каждый коммит имеет полный снимок каждого файла, объединение работает по:

  • сравнить базовый снимок слияния с нашим снимком: git diff --find-renames <em>hash-of-base</em> HEAD
  • сравнить базовый снимок слияния с их снимком: git diff --find-renames <em>hash-of-base</em> <em>other</em>

Для каждого файла, который находится во всех трех коммитах, это сравнение говорит «мы изменили файл» (делая все что угодно) и / или «они изменили файл» (делая все что угодно), или «никто не изменил файл вообще».

(Для файлов, которые находятся только в одном или двух коммитах, ситуация, очевидно, несколько иная, но сохраняется та же идея: мы изменились, они изменились, или оба.)

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

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

Документация по gitattributes имеет удивительно четкое (по Git стандартам документации) описание того, как настроить драйвер слияния. Необходимый драйвер довольно прост:

[merge "theirs"]
    name = use-theirs merge driver
    driver = cp %B %A

Ваш файл .gitattributes будет содержать строку:

path/to/folder/in/question/*  merge=theirs

Обратите внимание, что вы можете просто создать файл с именем .gitattributes по этому пути (path/to/folder/in/question), который говорит * merge=theirs, но если вы сделаете это, любые конфликтующие изменения в этом файле будут объединены драйвером слияния theirs. Это, вероятно, не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...