Вендор Филиалы в Git - PullRequest
       67

Вендор Филиалы в Git

27 голосов
/ 20 апреля 2009

Проект Git содержит второй проект, содержание которого обрабатывается независимо.

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

Слияние поддеревьев нельзя использовать, так как подпроект активно разрабатывается, а объединение поддеревьев затрудняет объединение этих обновлений обратно в исходный проект.

Мне сообщили, что решение известно в мире SVN как "Ветви поставщика", и что оно так просто делается в Git, что даже не требует адресации. Полуфабрикаты изобилуют в сети.

Тем не менее, я не могу заставить его работать.

Может кто-нибудь, пожалуйста (довольно, пожалуйста?) Объяснить, как я могу создать структуру, в которой один проект существует внутри другого, и оба могут разрабатываться и обновляться из одного и того же рабочего каталога. В идеале [или скорее: очень важно, если не поддерживается], что, когда клиент пытается загрузить «родительский» проект, ему следует автоматически предоставить последнюю версию подпроекта.

Пожалуйста, НЕ объясняйте мне, как я должен использовать подмодули или слияния поддеревьев или даже SVN: Externals. Этот поток является результатом следующего SO потока , и если что-то там пропустили, пожалуйста, отправьте его там . Эта тема пытается получить понимание того, как продавать ветки, и чем дольше, яснее и более придумано объяснение, тем более счастливым я стану.

Ответы [ 3 ]

33 голосов
/ 21 апреля 2009

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

Просто мысль; Вы хотите:

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

Два подхода не совместимы:

  • Первая стратегия совместима с объединением поддеревьев: вы работаете как над проектом, так и с подпроектом.
  • Второй используется с подмодулями, но подмодули используются для определения конфигурации (список тегов, с которыми вам нужно работать): каждый подмодуль git, в отличие от svn: externals, прикрепляется к определенному коммиту id, и это то, что позволяет вам определить конфигурацию (как в S C M: «программное обеспечение конфигурация управление»)

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

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


samgoody добавляет:

Представьте себе плагин eMap для Joomla и ModX. И плагин, и специфичный для Joomla код (который является частью Joomla, а не eMap) разрабатываются, пока плагин находится внутри Joomla. Все пути относительно, структура жесткая, и они должны быть распределены вместе - даже если у каждого проекта свой жизненный цикл.

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

Все сводится к проблеме гранулярности:

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

samgoody добавляет:

В оригинальном потоке перечислены проблемы с подмодулями - в первую очередь из-за того, что загрузка GitHub не включает их (жизненно важно для меня) и что они застряли при конкретном коммите.

Я не уверен, что загрузка GitHub недавно стала проблемой: в статье " Руководства: Разработка с подмодулями " упоминается:

Лучше всего: у людей, клонирующих ваш my-awesome-framework форк, не возникнет проблем при сбрасывании вашего подмодуля my-fantastic-plugin, поскольку вы зарегистрировали общедоступный URL-адрес клона для этого подмодуля. Команды

$ gh submodule init
$ gh submodule update

Перетянет подмодули в текущий репозиторий.

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

samgoody упоминает:

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

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

Слияние поддерево должно быть ответом здесь, но подразумевало бы объединение только коммитов, сделанных для файлов для основного проекта, а не коммитов, сделанных для подпроектов. Если вам удастся справиться с таким частичным слиянием, я считаю, что это верный путь.

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

8 голосов
/ 23 апреля 2009

Наконец у меня есть несколько часов доступа к сети, прежде чем я возвращаюсь в горы. Посмотрим, смогу ли я внести ясность в вашу ситуацию.

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

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

    • SVN позволит вам иметь несколько репо в одном, что кажется важным для вас. Я думаю, что это будет означать либо использование внешних элементов, либо шаблон Vendor Branch, чтобы приблизиться к тому, что вы хотите.

    • У Mercurial есть расширение, Лес, для используя вложенные репозитории, которые, кажется, лучше соответствуют вашей ментальной модели. Я выбрал Git вместо Mercurial 15 месяцев назад, но HG был стабильным и, по-моему, для многих применений сравним с Git. Я не знаю, насколько стабильно расширение.

  2. Если бы я был в вашей ситуации, я бы использовал два репозитория Git - одно для плагина и одно для MainProject. Поставщик будет заниматься разработкой в ​​репозитории плагинов и будет иметь ветку релизов, в которую они будут загружать текущие версии плагина без остальной среды разработки. Эта ветвь будет включена в репозиторий MainProject как ветка поставщика, а затем объединена с вашей основной веткой разработки. Когда ваша команда работает над изменением плагина, они разрабатывают его в функциональной ветви вашей основной ветки разработки и отправляют в репозиторий поставщика в виде исправлений. Это дает вам очень чистый рабочий процесс, Относительно прост в настройке и обучении, сохраняя историю развития отдельно.

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

  3. Если ваша команда действительно активно участвует в разработке плагинов или вы действительно хотите, чтобы история разработки проекта и плагина была интегрирована в одно Git-репо, просто используйте одно Git-репо. Вы можете извлечь плагин и его историю для записей вашего поставщика, как время от времени объясняет здесь . Это может дать вам меньше инкапсуляции, чем вы предполагали, но Git не предназначен для инкапсуляции - структура данных Git основана на отслеживании изменений в одном проекте.

Может быть, я неправильно понял вашу ситуацию, и ничего из этого не применимо. Если так, я прошу прощения. Спасибо за детали, которые вы и VonC проработали, которые заполнили многие дыры, которые у меня изначально были в попытке понять ваш вопрос.

0 голосов
/ 17 января 2018

Если вы ищете только название оригинального вопроса:

хороший шаблон для ветки вендора с git включен

https://www.roe.ch/Git_Reference

раздел Модель ветки поставщика

...