Скажем, я сотрудничаю с кем-то через репозиторий git, и есть конкретный файл, в который я никогда не хочу принимать какие-либо внешние изменения.
Есть ли способ настроить мое локальное репо, чтобы не жаловаться на конфликтующее слияние каждый раз, когда я git pull? Я хотел бы всегда выбирать мою локальную версию при объединении этого файла.
echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true
--global
тегом. Если вам нужно такое поведение только для одного репо, не--global
echo 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Ответы:
В отношении конкретного экземпляра файла конфигурации я согласен с ответом Рона :
конфигурация должна быть «частной» для вашей рабочей области (следовательно, «игнорироваться», как в «объявленной в
.gitignore
файле»).У вас может быть шаблон файла конфигурации с токенизированными значениями в нем и сценарий, преобразующий этот
config.template
файл в частный (и игнорируемый) файл конфигурации.Однако это конкретное замечание не отвечает на более широкий вопрос, то есть на ваш вопрос (!):
Этот вид слияния представляет собой «копирование слияния», при котором вы всегда будете копировать «нашу» или «их» версию файла всякий раз, когда возникает конфликт.
Для «файла» (файла в целом, не говоря уже о файле «конфигурации», поскольку это плохой пример), вы можете добиться этого с помощью специального сценария, вызываемого посредством слияния.
Git вызовет этот скрипт, потому что вы определите значение gitattributes , которое определяет настраиваемый драйвер слияния .
«Пользовательский драйвер слияния» в данном случае представляет собой очень простой скрипт, который в основном сохраняет неизменной текущую версию, что позволяет вам всегда выбирать локальную версию.
. IE, Как отмечено на Ciro Сантилли :
Давайте проверим это на простом сценарии с msysgit 1.6.3 в Windows, в простом сеансе DOS:
Теперь давайте создадим два файла, у которых будут конфликты, но которые будут объединяться по-разному.
Мы введем «конфликт» в содержимое обоих этих файлов в двух разных ветках git:
Теперь давайте попробуем объединить hisBranch с myBranch с:
dirWithCopyMerge\b.txt
котором я всегда хочу , чтобы сохранить свою версиюb.txt
.Поскольку слияние происходит в '
MyBranch
', мы вернемся к нему и добавимgitattributes
директивы ' ', которые будут настраивать поведение слияния.У нас есть
.gitattributes
файл, определенный вdirWithCopyMerge
каталоге (определенный только в ветке, где будет происходить слияние :)myBranch
, и у нас есть.git\config
файл, который теперь содержит драйвер слияния.Если вы еще не определили keepMine.sh и все равно запускаете слияние, вот что вы получите.
Это нормально:
a.txt
готов к слиянию и в нем есть конфликтb.txt
остается нетронутым, поскольку предполагается, что драйвер слияния позаботится об этом (из-за директивы в.gitattributes
файле в его каталоге).Определите
keepMine.sh
где угодно в вашем%PATH%
(или$PATH
для нашего друга Unix. Я, конечно, делаю и то, и другое: у меня есть сеанс Ubuntu в сеансе VirtualBox)Как отметил по lrkwz , и описано в разделе « Объединить Strategies разделе» из пользовательской настройки Git - Атрибуты Git , вы можете заменить скрипт с командой оболочки
true
.Но в общем случае вы можете определить файл сценария:
keepMine.sh
(это был один простой драйвер слияния;) (даже проще в этом случае, использование
true
)(Если вы хотите сохранить другую версию, просто добавьте перед
exit 0
строкой:cp -f $3 $2
.Вот и вы сливаться водитель будет Визитки держать версию приходя от другого. ветвь, отменяя любое локальное изменение)
Теперь давайте повторим слияние с самого начала:
Слияние не удается ... только для a.txt .
Отредактируйте a.txt и оставьте строку из hisBranch, затем:
Давайте проверим, что b.txt был сохранен во время этого слияния
Последний коммит действительно представляет собой полное слияние:
(Строка, начинающаяся с Merge, действительно доказывает это)
Считайте, что вы можете определить, объединить и / или перезаписать драйвер слияния, поскольку Git будет:
<dir>/.gitattributes
(который находится в том же каталоге, что и рассматриваемый путь): будет преобладать над другим.gitattributes
в каталогах.gitattributes
(который находится в родительском каталоге), устанавливает только директивы, если они еще не установлены$GIT_DIR/info/attributes
. Этот файл используется для переопределения настроек в дереве. Это перезапишет<dir>/.gitattributes
директивы.Под «объединением» я подразумеваю «объединение» нескольких драйверов слияния.
Ник Грин пытается в комментариях фактически объединить драйверы слияния: см. « Слияние pom через драйвер git python ».
Однако, как упоминалось в его другом вопросе , он работает только в случае конфликтов (одновременное изменение в обеих ветвях).
источник
cp -f $3 $2
, Вероятно , следует цитировать, т.е.cp -f "$3" "$2"
.PATH
(Unix или WindowsPATH
). Поскольку этот сценарий будет интерпретироваться через оболочку Unix bash или через оболочку MingWin bash MsysGit Windows, он будет переносимым.Как @ Сиро-Сантилли прокомментировал, простой способ сделать это , чтобы использовать
.gitattributes
с настройками этого:и включите эту стратегию с помощью:
(Я добавляю это в качестве ответа, чтобы сделать его более заметным, но делаю это вики сообщества, чтобы не пытаться получить для себя больше, чем пользователь. Пожалуйста, проголосуйте за его комментарий под Q здесь, чтобы воздать ему должное!)
источник
:-)
).У нас есть несколько файлов конфигурации, которые мы никогда не хотим перезаписывать. Однако .gitignore и .gitattributes не работали в нашей ситуации. Нашим решением было хранить файлы конфигурации в ветке конфигурации. Затем разрешите изменение файлов во время слияния git, но сразу после слияния используйте «ветку проверки git -». для копирования наших файлов конфигурации из ветки конфигурации после каждого слияния. Подробный ответ stackoverflow здесь
источник