Ответ 1
В итоге я нашел attributes
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
не работает. Каковы другие варианты? Обратите внимание, что проигнорированный файл должен быть частью проверки и фиксации, что важно. его следует игнорировать только во время слияний.
Спасибо!
В итоге я нашел attributes
git. Пробую это. Работаю до сих пор. Не проверял все сценарии еще. Но это должно быть решением.
Я решил эту проблему, используя команду 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, если у вас есть список файлов, которые нужно пропустить.
.gitattributes
- это файл корневого уровня вашего хранилища, который определяет атрибуты для подкаталога или подмножества файлов.
Вы можете указать атрибут, чтобы Git использовал разные стратегии слияния для определенного файла. Здесь мы хотим сохранить существующий config.xml
для нашей ветки. Нам нужно установить merge=ours
в config.xml
в файле .gitattributes
.
merge=ours
говорит git использовать наш (текущий ветвь) файл, если возникает конфликт слияния.
Добавьте файл .gitattributes
на корневом уровне хранилища.
Вы можете установить атрибут для confix.xml в файле .gitattributes
config.xml merge=ours
И затем определите фиктивную нашу стратегию слияния с:
$ git config --global merge.ours.driver true
Если вы объединяете stag
ветки dev
, вместо конфликта слияния с файлом config.xml ветвь оленя config.xml сохраняется в той версии, которая у вас была изначально.
Вы можете начать с использования git merge --no-commit
, а затем отредактировать слияние, как вам нравится, например, путем неготовности config.xml
или любого другого файла, а затем совершить. Я подозреваю, что вы захотите автоматизировать его дальше, используя крючки, но я думаю, что стоило бы пройти вручную хотя бы один раз.
Вы можете использовать .gitignore
, чтобы сохранить config.xml
из репозитория, а затем использовать post commit hook для загрузки соответствующего config.xml
на сервер.
Здесь git -update-index - записывать содержимое файла в рабочем дереве в индекс.
git update-index --assume-unchanged <PATH_OF_THE_FILE>
Пример: -
git update-index --assume-unchanged somelocation/pom.xml
Пример:
master
, develop
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