Обычный сценарий, когда я разрабатываю, заключается в том, что в базе кода будет несколько файлов конфигурации, для которых требуются настройки для конкретной машины. Эти файлы будут зарегистрированы в Git, и другие разработчики всегда случайно вернут их обратно и нарушат чью-то конфигурацию.
Простым решением было бы просто не регистрировать их в Git или даже дополнительно добавить для них запись .gitignore. Однако я считаю, что гораздо элегантнее иметь в файле несколько разумных значений по умолчанию, которые разработчик может изменять в соответствии со своими потребностями.
Есть ли элегантный способ заставить Git работать с такими файлами? Я хотел бы иметь возможность изменять файл конфигурации для конкретной машины, а затем иметь возможность запускать «git commit -a» без проверки этого файла.
источник
Ответы:
Пусть ваша программа прочитает пару файлов конфигурации для своих настроек. Во-первых, он должен прочитать
config.defaults
файл, который будет включен в репозиторий. Затем он должен прочитатьconfig.local
файл, который должен быть указан в.gitignore
При таком расположении новые настройки появляются в файле значений по умолчанию и вступают в силу сразу после его обновления. Они будут различаться в определенных системах только в том случае, если они будут отменены.
Как вариант, у вас может быть просто общий
config
файл, который вы отправляете в систему управления версиями, и заставляете его делать что-то вродеinclude config.local
внесения машинно-зависимых значений. Это вводит более общий механизм (по сравнению с политикой) в ваш код и, следовательно, позволяет более сложные конфигурации (если это желательно для вашего приложения). Популярным расширением this, которое можно встретить во многих крупномасштабных программах с открытым исходным кодом, является toinclude conf.d
, которое считывает конфигурацию из всех файлов в каталоге.Также см мой ответ на подобный вопрос.
источник
Можешь попробовать
git update-index --skip-worktree filename
. Это скажет git притвориться, что локальные изменения в имени файла не существуют, поэтомуgit commit -a
проигнорирует его. У него есть дополнительное преимущество, заключающееся в сопротивленииgit reset --hard
, так что вы случайно не потеряете свои локальные изменения. Кроме того, автоматическое слияние завершится ошибкой, если файл будет изменен в восходящем направлении (если копия рабочего каталога не совпадает с копией индекса, и в этом случае она будет автоматически обновлена). Обратной стороной является то, что команду нужно запускать на всех задействованных машинах, и это сложно сделать автоматически. См. Такжеgit update-index --assume-unchanged
несколько иную версию этой идеи. Подробности по обоим можно найти с помощьюgit help update-index
.источник
--skip-worktree
в этом случае похоже, что вы хотите .Другой подход - сохранить локальные изменения общих файлов конфигурации в другой частной ветке. Я делаю это для некоторых проектов, требующих нескольких локальных изменений. Этот метод может быть применим не ко всем ситуациям, но в некоторых случаях он работает для меня.
Сначала я создаю новую ветку на основе главной ветки (в этом конкретном случае я использую git-svn, поэтому мне нужно выполнить фиксацию от мастера, но это не очень важно здесь):
Теперь измените файл (ы) конфигурации по мере необходимости и зафиксируйте. Я обычно помещаю в сообщение фиксации что-то особенное, например «NOCOMMIT» или «PRIVATE» (это будет полезно позже). На этом этапе вы можете работать над своей частной веткой, используя свой собственный файл конфигурации.
Если вы хотите вернуть свою работу вверх по течению, выбирайте каждое изменение из своей
work
ветки к мастеру. У меня есть сценарий, который поможет в этом, он выглядит примерно так:Это первая проверка, чтобы убедиться, что я нахожусь в
master
ветке (проверка работоспособности). Затем он перечисляет каждуюwork
сделанную фиксацию , отфильтровывает те, которые упоминают ключевое слово NOCOMMIT, меняет порядок и, наконец, выбирает каждую фиксацию (теперь сначала от самой старой)master
.Наконец, после внесения изменений в основной восходящий поток, я снова переключаюсь на
work
и перебазирую:Git повторно применит каждый из коммитов в
work
ветке, фактически пропуская те, которые уже были примененыmaster
через выбор вишни. У вас должны остаться только локальные коммиты NOCOMMIT.Этот метод делает процесс отправки немного более трудоемким, но он решил проблему для меня, поэтому я решил поделиться.
источник
git commit -a
по миру?git rebase --onto
иgit fetch
делать то же самоеОдна из возможностей - иметь фактические файлы в вашем .gitignore, но проверять конфигурации по умолчанию с другим расширением. Типичным примером приложения Rails может служить файл config / database.yml. Мы проверяем config / database.yml.sample, и каждый разработчик создает свой собственный config / database.yml, который уже имеет .gitignored.
источник
Проверьте конфигурацию по умолчанию с другим расширением (скажем .default), используйте символическую ссылку для символической ссылки на правильное местоположение по умолчанию, добавьте правильное местоположение в .gitignore и добавьте все остальное, связанное с конфигурацией, в .gitignore (так что единственный то, что проверяется, это config.default).
Кроме того, напишите сценарий быстрой установки, который устанавливает символические ссылки для всего вашего приложения.
Мы использовали аналогичный подход в предыдущей компании. Сценарий установки автоматически определил, в какой среде вы работали (песочница, разработка, контроль качества, производство), и автоматически поступил правильно. Если бы у вас был файл config.sandbox и вы работали из песочницы, он связал бы его (в противном случае он просто связал бы файл .defaults). Обычная процедура заключалась в копировании .defaults и изменении настроек по мере необходимости.
Написать сценарий установки проще, чем вы думаете, и он дает вам большую гибкость.
источник
Я согласен с лучшим ответом, но также хотел бы кое-что добавить. Я использую сценарий ANT для удаления и изменения файлов из репозитория GIT, поэтому я уверен, что производственные файлы не будут перезаписаны. В ANT есть удобная опция для изменения файлов свойств java. Это означает помещение ваших локальных тестовых переменных в файл свойств в стиле Java и добавление некоторого кода для его обработки, но это дает вам возможность автоматизировать создание вашего сайта, прежде чем вы отправите его через FTP. Обычно вы помещаете свою производственную информацию в файл site.default.properties и позволяете ANT управлять настройками. Ваши локальные настройки будут в файле site.local.properties.
затем используйте это:
Ваш site.default.properties будет выглядеть так:
и ваш site.local.properties будет выглядеть так (обратите внимание на разницу между средой и включенными модулями):
И ваши инструкции ANT: ($ d {deploy} - целевой каталог развертывания)
источник
В настоящее время (2019 г.) я использую переменные ENV, например, в python / django, вы также можете добавить к ним значения по умолчанию. В контексте docker я могу сохранить переменные ENV в файле docker-compose.yml или в дополнительном файле, который игнорируется в системе контроля версий.
источник
Самое простое решение - отредактировать файл до значений по умолчанию, зафиксировать его, а затем добавить в свой
.gitignore
. Таким образом, разработчики не будут случайно зафиксировать это при выполненииgit commit -a
, но они все равно могут зафиксировать его в (предположительно редком) случае, когда вы хотите изменить свои настройки по умолчанию с помощьюgit add --force
.Тем не менее, наличие файла конфигурации
.default
и.local
в конечном итоге является лучшим решением, поскольку это позволяет любому, у кого есть конфигурация для конкретной машины, изменять значения по умолчанию, не нарушая свою собственную конфигурацию.источник
.gitignore
поздние версии , изменения все равно отслеживаются.Я делаю это так, как здесь рекомендуется, с файлами конфигурации по умолчанию и локальными. Чтобы управлять своими локальными конфигурационными файлами, которые находятся в проектах
.gitignore
, я сделал репозиторий git~/settings
. Там я управляю всеми своими локальными настройками из всех проектов. Вы можете создать, например , папкуproject1
в~/settings
и поместить все местные конфигурационные файлы для этого проекта в него. После этого вы можете создать символическую ссылку на эти файлы / папку на свойproject1
.При таком подходе вы можете отслеживать свои локальные файлы конфигурации и не помещать их в обычный репозиторий исходного кода.
источник
Основываясь на ответе @Greg Hewgill, вы можете добавить конкретный коммит с вашими локальными изменениями и пометить его как localchange:
Затем приступайте к добавлению коммитов вашей функции. После завершения работы вы можете объединить эту ветку обратно в master без фиксации localchange, выполнив следующие действия:
Эти команды будут:
1) Переустановите свою функциональную ветку на master, игнорируя фиксацию localchange. 2) Мастер быстрой перемотки вперед, не покидая функциональную ветку. 3) Добавьте фиксацию localchange обратно в верхнюю часть функциональной ветки, чтобы вы могли продолжить работу над ней. Вы можете сделать это с любой другой веткой, над которой хотите продолжить работу. 4) Сбросьте тег localchange на эту выбранную фиксацию, чтобы мы могли использовать
rebase --onto
снова таким же образом.Это не означает замену принятого ответа как лучшего общего решения, а как способ нестандартного мышления о проблеме. Вы в основном избежать случайного объединения локальных изменений в мастер лишь перебазирование от
localchange
доfeature
и быстро мастера переадресации.источник