Игнорирование локальных файлов в GIT?

Я и ещё один программист, работаем с проектом через bare-репозиторий. В проекте есть файл includes/config.php, который у меня имеет специфичные настройки. Чтобы данные изменения не отправлялись в центральный bare-репозиторий, я добавил его в файл .git/info/exclude. Всё бы ничего, но при таком подходе периодически возникают проблемы следующего характера:

1. в файл includes/config.php внесли глобальные изменения которые у меня тоже должны быть.

При попытке сделать git pull origin master получаем сообщение:
error: Your local changes to the following files would be overwritten by merge:
        includes/config.php
Please, commit your changes or stash them before you can merge.
Aborting



Не страшно, удаляем файл includes/config.php, успешно делаем git pull origin master, восстанавливаем удалённый файл, и скрываем факт того, что в данный файл были внесены изменения
git update-index --assume-unchanged includes/config.php
(не понятно, почему GIT автоматически не игнорирует эти изменения, файл ведь в исключении находится.)

2. После выполнения предыдущего пункта появляется ещё одна проблема — не возможно переключится на какую-либо ветку, которая создавалась ранее.

Получаем сообщение:
$ git checkout test_branch
error: Your local changes to the following files would be overwritten by checkout:
        includes/config.php
Please, commit your changes or stash them before you can switch branches.
Aborting



В данном случае помогает только git rebase. Но это не всегда приемлимо, потому как изменяются даты внесения коммитов.


Всё это напоминает пляски с бубном.

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


Какие есть решения данной проблемы?
  • Вопрос задан
  • 25182 просмотра
Решения вопроса 1
@avorobiev
Нужно вообще не хранить сами конфигурационные файлы в репозитории, а хранить там примеры конфигов.
Например ваш реальный конфиг должен размещаться по пути includes/config.php. Тогда:
1. в репозиторий добавляете файл includes/config.php-distr, который содержит структуру, настройки по-умолчанию, но не содержит никаких паролей и т.п.;
2. путем копирования includes/config.php-distr в includes/config.php и последующего редактирования с вводом паролей и т.п. создаете реальный конфиг. Чтобы он не оказался в репозитории, заносите его в .git/info/exclude.
3. в документацию по разворачиванию репозитория добавляете абзац про создание конфига путем копирования примера с последующей корректировкой.
Если надо что-то изменить в примере конфига — правите includes/config.php-distr и коммитите. Следом руками правите в includes/config.php, но в коммиты это не попадает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
akral
@akral
(не понятно, почему GIT автоматически не игнорирует эти изменения, файл ведь в исключении находится.)
Исключение файлов значит «не добавлять этот файл в репозиторий автоматически». Поскольку ваш файл уже в нём, исключение не актуально.

Прозрачно добавить свои изменения можно с помощью auto_prepend_file, например.
Ответ написан
Diam0n
@Diam0n
если я все правильно понял — .gitignore вам поможет
а иначе — только танцы
Ответ написан
Комментировать
Нужно удалить файл из индекса
git update-index --assume-unchanged FILENAME
и если надо будет обратная команда, для возвращения в индекс:
git update-index --no-assume-unchanged FILENAME
Но правда если в удаленном репозитории этот файл будет изменен (более новая версия), то тогда и локальный опять таки будет переписан.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы