.gitattributes & отдельная стратегия слияния для файла
У меня есть мастер и тестовая ветвь моего (веб) приложения. Эти проекты почти одинаковы, за исключением одного файла, который устанавливает приложение, скажем, "setup".
Всякий раз, когда я объединяю одну ветку с другой, я хотел бы, чтобы эта ветка сохраняла свою версию установки. То есть git не должен пытаться объединить изменения в этом файле.
Я следовал указаниям из книги Pro Git и создал файл.gitattributes со строкой "setup merge=ours". Тем не менее, это не работает - ни с быстрой пересылкой слияний нет, если я вводить конфликты.
(Точнее:
$: mkdir gitest
$: cd gittest
$: git init
$: echo "setup merge=ours" >> .gitattributes
$: echo "master" >> setup
$: git add setup .gitattributes
$: git commit -a -m ...
$: git branch test
$: git checkout test
$: echo "test" >> setup
$: git commit -a -m ...
$: git checkout master
$: git merge test
Ожидаемый результат: setup содержит слово "master", вместо этого git выполняет слияние ff, а setup "test".)
4 ответа
У меня была та же ошибка, и ее можно устранить, просто определив "наш" драйвер слияния в.git/config:
[merge "ours"]
name = "Keep ours merge"
driver = true
Поскольку true всегда возвращает 0, временный файл, содержащий текущее состояние, не будет изменен и останется в качестве окончательной версии.
Вы можете прочитать больше о драйвере слияния здесь: http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
Приложение:
Это работает каждый раз, когда драйвер фактически вызывается, и, кажется, это происходит, только когда есть коммиты, изменяющие те же файлы (git атрибут merge). Если есть изменения в одной ветке, драйвер не будет вызываться.
Я обнаружил, что если я изменил файлы в обеих ветвях и зафиксировал изменения в каждой ветке, а затем попытался выполнить слияние, он вызвал бы драйвер слияния и прослушал мой файл. .gitattributes
который указывает merge=ours
, После этого два файла всегда различаются в двух ветвях, поэтому драйвер слияния всегда будет вызываться, поэтому мне не нужно было иметь специальный драйвер слияния, который касается файла. Нужно было только сначала изменить оба.
Драйвер слияния вызывается только в нетривиальных случаях, т. Е. Если мастер и тест коснулись настройки (и вам необходимо определить драйвер слияния ours
первый):
git init
git config merge.ours.name '"always keep ours" merge driver'
git config merge.ours.driver 'touch %A'
echo "setup merge=ours" >> .gitattributes
echo "master" >> setup
git add setup .gitattributes
git commit -a -m ...
git branch test
git checkout test
echo "test" >> setup
git commit -a -m ...
git checkout master
echo "more content" >> setup
git commit -a -m ...
git merge test
Сказав это, мне интересно, имеет ли смысл вообще иметь настройку в репозитории. Если вы действительно хотите использовать управление версиями, вы можете использовать субмодули или стратегию слияния поддерев для синхронизации общих файлов.
Имейте чистый сценарий пятна вместо отдельных ветвей. Сценарий может отличаться в зависимости от того, на какой машине вы находитесь.