Заставить Git всегда выбирать более новую версию определенного файла во время слияния? Или зафиксировать только определенную ветку?

Я единственный разработчик для своего проекта. В разработке я использую один файл buildnumber.txt который мне нужен всегда самый последний, несмотря на ветку

когда я использую команду: git merge featureBranch --no-ff

Могу ли я где-нибудь указать, что в случае файла «buildnumber.txt» или какого-либо другого файла GIT всегда должен использовать более новую версию?

похоже на .gitignore, но для такого решения конфликтов слияния

или, может быть, указать, что файл «buildnumber.txt» будет храниться только в ветке «мастер», и когда я изменяю его в другой ветке, он будет игнорироваться в любой ветке, кроме «мастер», поэтому я нужно переключиться на мастер и проверить там?

благодарю вас


person Peter Turčan    schedule 30.01.2021    source источник
comment
Можете ли вы показать минимально воспроизводимый пример, где это не работает так, как вы ожидаете?   -  person mkrieger1    schedule 30.01.2021
comment
Вы можете определить собственный драйвер слияния. Драйвер получает версию предка, текущую версию и версию другой ветви. Реализуйте логику, чтобы решить, какая версия является последней, и перезапишите текущую версию последней версией.   -  person ElpieKay    schedule 30.01.2021
comment
Взгляните на git rerere, он позволяет записывать настройки слияния. git-scm.com/docs/git-rerere   -  person jessehouwing    schedule 30.01.2021


Ответы (1)


Короткий ответ: нет, вы не можете этого сделать (на самом деле ни одну из этих трех вещей). Более длинный ответ по-прежнему отрицательный, но объясняет почему.

Первая проблема заключается в том, что файлы в Git не имеют имеют даты. Возможно, это не такая уж большая проблема, потому что Git не хранит файлы в первую очередь: Git хранит коммиты. У коммитов do есть даты, а у коммитов есть и файлы, поэтому вы можете просто использовать дату фиксации в качестве псевдодаты каждого из файлов в коммите. Затем вы можете выбрать самую новую версию файла commit. Слияние работает по коммитам, поэтому тот факт, что именно коммит имеет дату, не должен (логически) не быть здесь проблемой (хотя обратите внимание, что физический доступ к дате коммита будет большой проблемой, как только вы доберетесь до этого уровня).

Но это все еще не совсем то, что вам нужно, и в любом случае в Git нет встроенного механизма для этого. Git не заинтересован в датах во время слияния. Git интересует только содержимое файла. Вы можете попытаться использовать предложение ElpieKay о применении драйвера слияния (эта ссылка идет к документации gitattributes, где вы увидите описание драйверов слияния), но оказывается, что это тоже не лучший подход. См. Стратегия слияния .gitattributes не работает для объяснения того, почему это не так хорошо. (Часть TL;DR заключается в том, что ваш пользовательский драйвер слияния не используется, если только нужно выполнить какое-либо слияние, а иногда слияние вообще не требуется. В одном случае это работает в вашу пользу, а в другом — нет.)

На самом деле, лучший подход почти наверняка состоит в том, чтобы вообще не хранить номер версии сборки в Git. Если у вас есть файл рабочего дерева с именем version.txt, которого вообще нет ни в одном коммите, это будет просто неотслеживаемый файл, который вы можете исключить из всех коммитов. Переход от одного коммита к другому не затронет этот файл, так как он никогда не является частью репозитория. Проверка изменений ветки, которые вы используете, но, поскольку файл не находится в фиксации, он не будет скопирован в ваше рабочее дерево. Слишком поздно делать это с файлом, который вы уже включили в существующие коммиты, поскольку эти коммиты буквально нельзя изменить, но вы можете либо переписать историю своего репозитория, либо просто изменить имя файла.

Чтобы неотслеживаемый файл не отслеживался, его имя может быть указано в файле .gitignore. Обратите внимание, что перечисление файла в .gitignore не имеет никакого эффекта, если этот файл уже отслеживается, т. е. находится в индексе Git. (Ответ на вопрос, когда файл находится в индексе Git, довольно длинный.)

person torek    schedule 30.01.2021