Вопрос по git, git-branch, merge, branch – Запретить слияние файла с мастером с помощью Git

4

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

mkdir git
cd git
git init
echo "B" > b.txt
git add b.txt 
git commit -m 'Initial commit'

echo "b.txt merge=keepMine" > .gitattributes
git add .gitattributes 
git config merge.keepMine.name "always keep mine during merge"
git config merge.keepMine.driver "keepMine.sh %O %A %B"
git commit -m 'Ignore b.txt'

git checkout -b test # Create a branch
git checkout master # Back to master and make change
echo "Only in master" > b.txt
git commit -a -m 'In master'

git checkout test
git merge master # The change in b.txt is being merged...

Любая идея? Спасибо..

Это выглядит как странное желание объединить все, кроме одного файла. Это против идеологии git, когда весь контент поддерживается как единое целое. Не могли бы вы объяснить вариант использования? Зачем тебе это? Ilya Ivanov

Ваш Ответ

2   ответа
1

Я подозреваю, что это не сработало, потому что не было конфликтов слияния.

Тем не менее, я могу подтвердить, чтоgit merge master --strategy=ours работает как положено.

Это может быть то, что вы ищете:Как сказать Git всегда выбирать мою локальную версию

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

Короче говоря, причина, по которой он не работает в вашем случае использования, заключается в том, чтоyour use case is not a merge, Он только отображает кучу изменений на master с созданием временной ветки, называемой test, а затем перемещаемой на master.You never actually introduce a commit while you're on the test branch.

можно ли остановить автоматическое слияние (только для каждого файла, а не для глобального) Ryan
Можете ли вы сказать мне команду или метод? Спасибо.. Ryan
git merge master --strategy = наша ожидаемая работа, но иногда нам просто нужно применить эту стратегию для отдельного файла, а не для всего дерева. Кажется, это ошибка? Ryan
Нет, это не ошибка. В вашем вопросе слияние слишком простое, поэтому Git не использует альтернативную стратегию слияния. Вот простой эксперимент - внесите различные изменения в одну и ту же строку в каждой ветви, а затем попытайтесь объединить. Это создаст конфликт, а затем git будет использовать файл атрибутов, чтобы выбрать ваш.
Да, это возможно.
0

Пользовательский драйвер слияния, упомянутыйcarleeto показано в & quot;Скажите git не объединять двоичные файлы, а выбирать& Quot ;:

Вы можете заявить в.gitattributes подайте вид слияния, который вы хотите:

echo yourConfigFile merge=keepMine > parentDirectory\.gitattributes
да, так кажется, единственный способ использоватьgit merge master --strategy=ours Ryan
@ Йога, да, похоже.
@Yoga: верно, это не будет работать в вашем случае, когда нет конфликта (только новые модификации отmaster ветка)
Я обновил свои журналы команд выше, все еще не работает. По крайней мере, Git должен подсказать мне о пропавшемkeepMine.sh но кажется это просто игнорируется .. Ryan

Похожие вопросы