Git - Игнорировать файлы во время слияния

У меня есть репо, называемое myrepo на удаленном сервере beanstalk.

Я клонировал его на свою локальную машину. Созданы две дополнительные ветки: staging и dev. Толкали эти ветки и на отдаленные.

Теперь:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

У меня есть файл с именем config.xml, который отличается от каждой ветки.

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

Я хочу, чтобы это было так: у нас есть развертывание script, которое вытягивает (проверяет) конкретную ветку и разворачивается на соответствующих серверах. Поэтому нам нужно, чтобы файл config.xml этой конкретной ветки переходил на конкретный сервер, как указано выше при развертывании.

Я думаю, .gitignore не работает. Каковы другие варианты? Обратите внимание, что проигнорированный файл должен быть частью проверки и фиксации, что важно. его следует игнорировать только во время слияний.

Спасибо!

Ответ 2

Я решил эту проблему, используя команду git merge с параметром --no-commit а затем явно удалил промежуточный файл и проигнорировал изменения в файле. Например: сказать, что я хочу игнорировать любые изменения в myfile.txt Я действую следующим образом:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Вы можете поместить операторы 2 и 3 в цикл for, если у вас есть список файлов, которые нужно пропустить.

Ответ 3

.gitattributes - это файл корневого уровня вашего хранилища, который определяет атрибуты для подкаталога или подмножества файлов.

Вы можете указать атрибут, чтобы Git использовал разные стратегии слияния для определенного файла. Здесь мы хотим сохранить существующий config.xml для нашей ветки. Нам нужно установить merge=ours в config.xml в файле .gitattributes.

merge=ours говорит git использовать наш (текущий ветвь) файл, если возникает конфликт слияния.

  1. Добавьте файл .gitattributes на корневом уровне хранилища.

  2. Вы можете установить атрибут для confix.xml в файле .gitattributes

    config.xml merge=ours
    
  3. И затем определите фиктивную нашу стратегию слияния с:

    $ git config --global merge.ours.driver true
    

Если вы объединяете stag ветки dev, вместо конфликта слияния с файлом config.xml ветвь оленя config.xml сохраняется в той версии, которая у вас была изначально.

Ответ 4

Вы можете начать с использования git merge --no-commit, а затем отредактировать слияние, как вам нравится, например, путем неготовности config.xml или любого другого файла, а затем совершить. Я подозреваю, что вы захотите автоматизировать его дальше, используя крючки, но я думаю, что стоило бы пройти вручную хотя бы один раз.

Ответ 5

Вы можете использовать .gitignore, чтобы сохранить config.xml из репозитория, а затем использовать post commit hook для загрузки соответствующего config.xml на сервер.

Ответ 6

Здесь git -update-index - записывать содержимое файла в рабочем дереве в индекс.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

Пример: -

git update-index --assume-unchanged somelocation/pom.xml

Ответ 7

Пример:

  1. У вас есть две ветки: master, develop
  2. Вы создали файл в ветки develop и хотите игнорировать его при объединении

Код (в корне yout git):

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

Вы также можете игнорировать файлы с таким же расширением

например, все файлы с расширением .txt:

echo "*.txt merge=ours" >> .gitattributes