Большое спасибо @VonC за предложение использовать атрибут merge = custom-driver в файле .gitattributes . Хотя это будет работать, я не хочу загрязнять свое рабочее пространство файлами .git, и хотя я мог бы использовать $ GIT_DIR / info / attribute , чтобы избежать загрязнения, я обеспокоен необходимостью в 2 правила для ловли точечных и не точечных файлов.
После нескольких экспериментов мне удалось найти решение с работающей конфигурационной переменной merge.default (упоминаемой в справочной странице gitattributes (5) ). Уловка, которую я пропустил, состояла в том, что merge.default принимает имя пользовательского драйвера, который вы определили ранее; Вы не даете ему пользовательскую команду напрямую. Вот что у меня работает ...
Сначала определите свой драйвер копирования-слияния. Вы можете использовать команды оболочки напрямую; внешний скрипт не нужен (просто убедитесь, что вы правильно указали метасимволы оболочки):
git config merge.copy-merge.name 'Copy Merge'
git config merge.copy-merge.driver 'mv %B %A'
Обратите внимание, что mv возвращает 0 в случае успеха, 1 в случае неудачи, что соответствует критериям для сообщения об успешном слиянии обратно в git.
Теперь скажите git, что ВСЕ слияния - это слияния копий:
git config merge.default copy-merge
Привет, Престо! Работа выполнена. git merge теперь будет копировать-объединять все, поэтому в вашей ветке содержатся точные копии всех файлов на . Что и требовалось доказать.
Если вы хотите выполнить слияние без копирования, просто сбросьте драйвер слияния по умолчанию:
git config --unset merge.default
Если вы хотите быть более избирательным, оставьте merge.default неустановленными и используйте атрибуты, как @VonC говорит:
cd path/to/copy-merge/in
echo '* merge=copy-merge' > .gitattributes
echo '.* merge=copy-merge' >> .gitattributes
Делайте это в верхней части каждого поддерева, в которое вы хотите скопировать-объединить. Если есть поддерево, в которое вы НЕ хотите копировать-объединять, вы можете отключить его снова:
cd path/to/copy-merge/in/path/to/normal-merge/in
echo '* merge' > .gitattributes
echo '.* merge' >> .gitattributes
ВНИМАНИЕ: засорение вашего рабочего дерева большим количеством файлов .gitattributes неизбежно приведет к путанице, особенно если вы также используете такие вещи, как "* .bin -merge" в других каталогах, чтобы заставить все слияния файлов .bin завершаться с ошибкой конфликты. Может быть лучше использовать $ GIT_DIR / info / attribute для такого рода вещей, поскольку он имеет наивысший приоритет.