Система управления версиями с несколькими подобными проектами (один настроенный для каждого покупателя того же продукта)

У меня есть несколько проектов SW от различных клиентов, с которыми я реализую систему управления версиями мерзавца, и я хотел бы знать то, что является лучшим способом сделать это. Проекты подобны и чаще всего полученные из существующих, но уникальны для каждого клиента. Я создал бы repo для каждого клиента, или я создам новые ответвления вместо этого.

5
задан yan bellavance 12 January 2010 в 04:41
поделиться

4 ответа

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

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

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

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

        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

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

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

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

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

  • Вы хотите приятные, отдельные комки определенные клиенты изменения в советах истории?
  • Будут ли несколько людей доступ к репозиториям?
    • История переписывания (например, с ребазой) может быть больно для нескольких пользователей или даже нескольких рабочих репозиториев одного пользователя.
  • Насколько взаимосвязаны изменения в проекте изменения и базовый код / ​​данные?
  • . Некоторые проекты тесно связаны с (делятся большинство изменений в других проектах?
  • Есть ли инструмент (Stgit, TopGit, вина, И т. Д.) Это может помочь управлять историей проекта в удобном способе?

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

Мой совет, который он читает как можно большее из документации , и заставить вас собственными обоснованными решениями. Руководство пользователя GIT - это хорошее место для начала. Мне особенно понравилось Git для компьютерных ученых и погружение снизу вверх для понимания гита изнутри. Наличие твердого понимания на внутренних органах Git действительно помогает вам понять как (концептуально) простым ( Git Merge ) и более сложный ( Git Cherry-Pick , GIT REBASE [-I] ) Гитные команды.

14
ответ дан 18 December 2019 в 09:50
поделиться

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

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

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

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

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

1
ответ дан 18 December 2019 в 09:50
поделиться

Если вы выполняете повторную настройку, вы переписываете историю. И так же, как в реальном мире, если вы хотите переписать историю, вам нужен заговор: все должны быть «в» заговоре (по крайней мере, все, кто знает об истории, то есть все, кто когда-либо вытащил из филиала).

Пока круг людей, которые тянут из отделения, жестко контролируется, довольно легко получить заговор, однако, как только вы публикуете эту историю, становится много труднее. Однако это не невозможно: филиал pu в репозитории Git Junio C Hamano, например, получает ребенды после каждого выпуска, и это широко опубликованный репозитарий. Способ работы заключается в том, что тот факт, что ветвь будет часто пересматриваться, и время, когда это произойдет, широко документируются на сайте Git, вики-листе Git и списке рассылки Git, и каждая ребаза объявляется в списке рассылки заранее, чтобы люди могли подготовиться к нему.

-121--1421896-

2 подходы - создать сложное приложение AJAX, которое хранит все на клиенте и отправляет на сервер только весь пакет изменений. Я сделал это несколько лет назад с умеренным успехом. Приложение - это не то, что я хотел бы поддерживать. Вам трудно синхронизировать код клиента с кодом сервера, и передача добавленных/удаленных/измененных полей является кошмарной.

Второй подход заключается в сохранении изменений в базе данных во временной таблице или в режиме «ожидания». Преимущество в том, что ваш код более удобен для обслуживания. Недостаток заключается в том, что вы должны иметь способ очистить оставленные изменения из-за тайм-аута сеанса, сбоев питания, других сбоев. Я бы использовал такой подход для любого нового развития событий. Вы можете иметь отдельные таблицы для «ожидающих» и «зафиксированных» изменений, которые открывают совершенно новый уровень функций вы можете добавить. Что изменилось? и т.д.

-121--4716666-

я пойду на создание новых ветвей. таким образом, меньше повторяющегося кода. DRY - правило большого пальца

1
ответ дан 18 December 2019 в 09:50
поделиться

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

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

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

1
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: