Лучшая практика для управления вариантами проекта в 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 будет свое собственное репо, и они смогут извлечь из этого "общего" третьего репо.

Я думаю, что ваша идея "фильтрованного натяжения" затруднит мантеин.

Другие вопросы по тегам