Как я могу объединиться в Git без изменения файлов конфигурации в master?

У нас есть несколько файлов конфигурации, которые содержат информацию, такую ​​как URL-адрес, который необходимо изменить для нашей среды разработчика. Мы создаем среду разработчика как ветвь в git и вносим изменения в файлы конфигурации. Проблема заключается в том, что когда мы объединяем ветвь разработки обратно в главную ветвь, она меняет файлы конфигурации в основной ветке.

Мы хотели бы сохранить файлы в git, поэтому я не считаю, что мы можем использовать .gitignore. Нам нужно сохранить весь наш источник в репо, поскольку мы используем эластичный beanstalk, и вам нужно каждый раз развертывать весь источник.

Мы попытались использовать .gitattributes и прочитали многие сообщения, такие как Как сообщить git, чтобы всегда выбирать локальную версию для конфликтующих слияний в определенном файле?, но кажется, что драйвер слияния, который вы настраиваете в .gitattributes, будет вызываться только в том случае, если есть изменения в обоих файлах. В нашем случае мы не будем изменять файлы конфигурации в главной ветки, поэтому драйвер слияния никогда не вызывается.

Есть ли простой способ сделать это без записи script?

Ответ 1

После исследования ряда команд git, таких как rebase и fetch, я нашел простой способ сделать это. Просто создайте ветку как сироту, скопируйте в нее файлы конфигурации и используйте команду "git checkout configs_branch -.", Чтобы по существу копировать файлы конфигурации в родительскую ветвь.

Итак, подробно:

инициализировать репо git с репо url

git удаленный добавочный источник (удаленный URL-адрес репозитория)

убедитесь, что вы находитесь в ветке, которую хотите создать ветку из

создайте ветку, которая будет содержать файлы конфигурации в виде ветки-сирота, чтобы ветвь не содержала весь ваш источник

git checkout --orphan configs_branch

скопируйте файлы конфигурации в эту ветвь репо, добавьте файлы, скопируйте и нажмите

git добавить.

git commit -m "первоначальная фиксация с файлами конфигурации"

git push origin configs_url

ПОСЛЕ УСПЕШНОГО СМЕРТИ

из родительской ветки

git checkout parentbranchname

git fetch --all

скопируйте файлы из ветки конфигурации в родительскую ветвь

git checkout configs_branch -.

(вы по-прежнему будете на родительской ветке после указанной выше команды)

зафиксировать файлы

git commit -m "сброс конфигурационных файлов"

Спасибо @vampire за вашу помощь!

Ответ 2

Решение прост: не храните файл конфигурации.

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

Расширенное использование - создать два файла конфигурации: по умолчанию приложения и локальные переопределения. По умолчанию фиксируются, локальные переопределения не выполняются. Преимущество такого подхода заключается в том, что вы переопределяете только то, что вам нужно, и оставляете другие значения неопределенными, поэтому при изменении значения по умолчанию вам не нужно обновлять локальную конфигурацию переопределения. Недостатком является то, что вы должны загружать и объединять два файла конфигурации во время инициализации вашего приложения.

Ответ 3

Вы просили решения без необходимости писать script. Мое решение включает скрипты. Однако они уже написаны.

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

2) Создавайте конфликты слияния при каждой фиксации в этом файле (в противном случае слияние тривиально и драйвер слияния не будет использоваться). Это можно сделать с помощью крюка post-commit в .git/hooks/post-commit, который изменяет этот файл в каждой ветке после каждой фиксации.

Я объединил это в некоторых сценариях: https://github.com/keepitfree/faithfulgit