Система контроля версий с несколькими аналогичными проектами (по одному для каждого клиента одного и того же продукта) - PullRequest
5 голосов
/ 12 января 2010

У меня есть несколько проектов ПО от разных клиентов, с которыми я внедряю систему контроля версий git, и я хотел бы знать, как лучше всего это сделать. Проекты похожи и чаще всего получены из существующих, но уникальны для каждого клиента. Буду ли я создавать репо для каждого клиента или вместо этого буду создавать новые филиалы.

Ответы [ 4 ]

14 голосов
/ 12 января 2010

Никто здесь не сможет дать вам «лучший» способ с такой ограниченной информацией.

Как и в случае многих других распределенных систем управления версиями, решение о том, как вы собираетесь публиковать свои проекты (много веток в одном репозитории или несколько репозиториев с одним / несколькими ветвями в каждом), в значительной степени независимо. из наиболее важных вопросов общего управления историей (как вы будете обрабатывать историю, которую записывает Git).

Я бы начал с определения того, какие биты данных и истории должны быть общими для всех проектов. Заглядывая вперед, история повлечет за собой не только то, что произошло в прошлом, но и то, что вы ожидаете в будущем.

Звучит так, как будто вы можете захотеть иметь базовый набор файлов, который является общим для всех ваших проектов, а затем иметь некоторые файлы / изменения для каждого проекта, расположенные поверх базового набора файлов. Как диаграмма истории это может выглядеть так:

        a1--a2--a3    customer-a
       /
o--o--o               base
       \
        b1            customer-b

В дальнейшем, возможно, будет достаточно внести изменения на «основе» и просто объединить их с филиалами клиентов:

        a1--a2--a3--a4------a5    customer-a
       /           /       /
o--o--o--o--o--o--o--o----o       base
       \           \       \
        b1----------b2--b3--b4    customer-b

Или, может быть, вы хотите «плавать» специфичные для клиента изменения поверх базовых изменений с помощью чего-то вроде git rebase:

Rebase customer changes on top of four new base changes:

         a1--a2--a3
        /           a1'--a2'--a3'    customer-a
       /           /
o--o--o--o--o--o--o                  base
       \           \
        \           b1'              customer-b
         b1

Another change for B, and two more changes in base:

                      a1'--a2'--a3'
                     /
                    /     a1''--a2''-a3''   customer-a
                   /     /
o--o--o--o--o--o--o--o--o                   base
                   \     \
                    \     b1''--b2'         customer-b
                     \
                      b1'--b2

Вы можете интерпретировать каждую из вышеперечисленных меток (base, customer-a, customer-b) как ветки, но вы также можете легко опубликовать каждую из них как отдельную ветку в отдельных репозиториях без потери функциональности (хотя вы можете хочу разработать и протестировать с рабочим репозиторием, у которого есть вся история).

В зависимости от характера установок проекта / клиента, данные, специфичные для проекта, могут даже не иметь отношения к базовому коду / данным. Если проекты не требуют изменений в базовых файлах (например, все настройки выполняются в файлах конфигурации, которых нет в самой базе), то вы можете сохранить простые линейные истории (ветви) для конфигурации каждого проекта вместе со всеми история, которую вы любите (ветви / теги) для базовых файлов. Затем для каждой установки вы можете проверить базовую и специфическую для проекта конфигурацию и настроить ее на выполнение.

Возможно, вы даже решите сохранить историю каждого проекта полностью независимой и просто применять исправления по мере необходимости для различных проектов (но на самом деле это означает, что вы теряете большую часть преимуществ от использования мощной системы контроля версий). Вы все еще можете публиковать такой набор «несвязанных» веток в одном репозитории (как вы действительно публикуете, не зависит от того, как вы управляете историей).

Какой путь вы выберете, зависит от того, как вы хотите управлять историей.

  • Вы хотите, чтобы отдельные, отличающиеся от клиентов изменения были на кончиках истории?
  • Будет ли несколько человек иметь доступ к репозиториям?
    • Переписывание истории (например, с rebase) может быть болезненным для нескольких пользователей или даже для нескольких рабочих репозиториев одного пользователя.
  • Насколько взаимосвязаны специфичные для проекта изменения и базовый код / ​​данные?
  • Связаны ли некоторые проекты с другими проектами (поделиться большинством изменений)?
  • Существует ли инструмент (StGit, TopGit, Guilt и т. Д.), Который может помочь в управлении историей каждого проекта удобным способом?

Помимо простого управления историей, вам также необходимо учитывать возможности вашего поставщика услуг Git (например, GitHub, git.or.cz, пользовательская установка gitorious / gitosis /… и т. Д.). Если у вас есть несколько разработчиков и вы хотите ограничить их работу над определенными проектами / клиентами, вам, возможно, придется публиковать их в нескольких репозиториях (если используемая вами служба Git не разрешает разрешения для каждой ветви). Но управление историей - это та часть, которую лучше всего понять правильно. Вы всегда можете изменить способ публикации своей истории, гораздо труднее переписать опубликованную историю.

Мой советчитать как можно больше документации и принимать самостоятельные решения. Руководство пользователя Git - хорошее место для начала. Мне особенно понравились Git для компьютерных ученых и Git снизу вверх для понимания Git изнутри. Твердое владение внутренностями Git действительно помогает вам понять как (концептуально) простое ( git merge ), так и более сложное ( git cherry-pick , git rebase [-i] ) Команды Git.

1 голос
/ 12 января 2010

Примечание: у вас всегда будет «один репо на клиента».
Вопрос в том, как использовать это репо. Если он создан из одного уникального центрального репо, он получит все историю этого репо.

Чтобы сформулировать один из следующих вариантов: «Если у вас есть несколько разработчиков и вы хотите ограничить их работу над определенными проектами / клиентами, вам, возможно, придется публиковать в нескольких репозиториях» из ответа Chris Johnsen

Если у вас есть проблемы с конфиденциальностью между клиентами, вы можете рассмотреть следующие вопросы:

  • одно центральное репо (которое запрещает любой толчок к нему), представляющее общий шаблон
  • по одному клонированному репо на клиента, где выполняется работа (в одной специализированной ветви)
  • одно частное репо (которое запрещает любое извлечение из него), где вы можете отодвинуть работу, выполненную от клиента, в нескольких филиалах.
    Из этого частного репо вы можете:
    • обновить часть шаблона с некоторыми улучшениями из веток клиентов
    • экспорт патчей и их применение в публичном центральном репо.

Механизмы запрета push / pull будут зависеть от того, как вы делитесь / получаете доступ к своему центральному репо (либо через общедоступного поставщика услуг Git, либо через 8 способов поделиться своими репо )

1 голос
/ 12 января 2010

Можно подумать о том, чтобы иметь какую-то библиотеку , которая будет связана с обоими проектами. И поместите вещи, которые можно использовать в нескольких проектах, в эту библиотеку. Они автоматически появятся во всех проектах.

Что касается самих проектов, репо сингл определенно лучше. Сохраняйте чистую историю, и вы вообще можете избежать слияний, просто выберите нужные вам ревизии из другой ветки (которые не могут быть разбиты на библиотеки).

Так что я бы придерживался двух репо. Один для общей библиотеки и один для всех ваших проектов на ее основе.

1 голос
/ 12 января 2010

я пойду на создание новых веток. таким образом менее повторяется код. СУХОЕ правило большого пальца

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...