Лучшая практика для управления вариантами проекта в Git?
Мне нужно разработать два проекта Django, которые разделяют 90% одного и того же кода, но имеют некоторые вариации в нескольких приложениях, шаблонах и в самой модели.
Я использую Git для распределенного контроля версий.
Мои требования таковы:
общий код для обоих проектов разрабатывается в одном месте (среда разработки Project1)
периодически это сливается со средой разработки второго проекта (Project2)
варианты не легко инкапсулируются в приложениях. (например, есть приложения. такие как "профили", которые различаются между Project1 и Project2, но для которых также существует постоянная общая эволюция)
и Project1, и Project2 имеют публичные репозитории, так что я могу сотрудничать с другими
Точно так же Project1 и Project2 должны иметь серверы разработки, демонстрации, подготовки и производства.
однако общедоступный репозиторий не находится на одном сервере в обоих случаях. Так, например, когда я занимаюсь разработкой в Project1, я хочу иметь возможность "проталкивать" мой github-сервер, но не иметь возможности для Project2.
Есть файлы, такие как local_settings.py, которые полностью различаются между Project1 и Project2, но должны быть разделены между несколькими разработчиками каждого проекта
Так каков наилучший способ справиться с этой ситуацией?
То, что казалось бы идеальным, было бы что-то вроде "отфильтрованного пулла", где вместо.gitignore, говоря "полностью игнорировать этот файл", я могу сказать "игнорировать этот файл при извлечении из этого репо", я не мог видеть ничего такого в документации, но может быть что-то подобное?
5 ответов
Переместите общий код в свою собственную библиотеку и сделайте его зависимым от этих двух проектов. Это не вопрос контроля версий, а вопрос повторного использования кода, проектирования и устранения дублирования.
Учитывая, что это сайт Django / Pinax, с вариантами, разбросанными по нескольким различным приложениям, я бы не рекомендовал использовать подмодули.
Варианты должны управляться независимо в ветке project1 и project2, что устраняет необходимость "фильтровать" результат gitignore.
Если вы идентифицируете некоторые действительно общие коды, они могут оказаться в третьем репо, которое вы можете затем "объединить в поддерево" с репозиториями project1 и project2 (значение стратегии слияния поддеревьев показано в этом ответе SO)
Вы можете использовать две разные ветки git для разработки. Когда вы делаете изменения в одном, которые являются общими для другого, просто выберите их git-cherrypick. Вы также можете толкать и тянуть определенные ветви, так что никому не нужно знать, что вы работаете с ними обоими одновременно.
Я хотел бы попробовать подмодули: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
Я сделал бы третий репо, где я бы разместил код, который разделяют Projects. Тогда у Project1 и Project2 будет свое собственное репо, и они смогут извлечь из этого "общего" третьего репо.
Я думаю, что ваша идея "фильтрованного натяжения" затруднит мантеин.