Альтернативы подмодулям Git?

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

  • Существуют ли другие инструменты для проектов с несколькими репозиториями и как они соотносятся?
  • Могут ли эти инструменты работать в Windows?

person Chau Chee Yang    schedule 28.06.2011    source источник
comment
Вы говорите о стратегии слияния поддеревьев Git или о Git-subtree Эйвери Пеннаруна? Эти два принципиально не одинаковы.   -  person kynan    schedule 14.04.2012
comment
Полезно прочитать здесь codingkilledthecat.wordpress .com/2012/04/28/   -  person nawfal    schedule 24.02.2013
comment
См. мой неофициальный форк gitslave, надеюсь, более активный, чем оригинал, начиная с версии 2.0.2.   -  person Joel Purra    schedule 05.01.2017
comment
Существует также git-subrepo.   -  person huggie    schedule 13.03.2018


Ответы (4)


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

  • gitslave полезен, когда вы контролируете и разрабатываете подпроекты примерно в то же время, что и суперпроект, и, кроме того, когда вы обычно хотите пометить, разветвить, нажать, вытащить и т. д. все репозитории одновременно. Насколько я знаю, gitslave никогда не тестировался на Windows. Для этого требуется перл.

  • git-submodule лучше, когда вы делаете не контролировать подпроекты или, более конкретно, не хотят исправлять подпроект в определенной версии, даже если подпроект изменяется. git-submodule является стандартной частью git и поэтому будет работать в Windows.

  • git-subtree предоставляет интерфейс для встроенной в git стратегии слияния поддеревьев. Лучше, если вы предпочитаете иметь унифицированную историю git с одним репозиторием. В отличие от стратегии слияния поддеревьев, легче экспортировать изменения в разные деревья (каталоги) обратно в исходный проект, но это не так автоматически, как с gitslave или даже с git-submodule.

  • репозиторий теоретически похож на gitslave, но не так хорошо задокументирован для операций не на Android, которые Я нашел. Он в значительной степени посвящен модели разработки Google Android и изначально поддерживает только несколько команд git (хотя вы можете запускать произвольные команды), а ограниченная собственная поддержка не поддерживает, например, централизованный репозиторий для отправки и проверки ветвь кажется довольно сложной.

  • mr от kitenet — это то, что вы хотели бы использовать, если у вас есть несколько систем управления версиями, но в основном ограничен для суперпроектов только для git из-за подхода с наименьшим общим знаменателем. Есть способы запуска произвольных команд, но они не так хорошо интегрированы.

person Seth Robertson    schedule 28.06.2011
comment
Обратите внимание, что git-subtree в этом ответе относится (как уже упоминалось) к стратегии слияния поддерева Git, а не к поддерево git Эйвери Пеннаруна, которые принципиально не совпадают. Последний был специально разработан, чтобы позволить вносить изменения обратно из поддерева. - person kynan; 14.04.2012
comment
Отличный развал! Я бы хотел, чтобы в него были внесены поправки, чтобы отличать слияние поддеревьев от git-subtree, как упоминает @kynan. - person BrianTheLion; 12.10.2012
comment
mr не ограничивается наименьшим общим знаменателем, доступны все команды git (включая те, у которых нигде нет эквивалента). - person Tobu; 05.11.2012
comment
@Tobu: я не считаю способность mr запускать произвольные команды тем же, что и встроенную поддержку команд git. Я предполагаю, что здесь вы говорите о чем-то вроде mr run git config ... или, возможно, (что еще хуже) о методе файла конфигурации для присвоения конкретных команд именам. Конечно, если вы знаете о некоторых функциях mr, которые не были сразу очевидны при чтении справочной страницы, я хотел бы знать об этом. - person Seth Robertson; 12.11.2012
comment
@kynan: в дополнение к вашему комментарию. Я хотел бы отметить, что git-поддерево Avery's Pennarun теперь доступно в git 1.7.11 и выше. - person slatunje; 14.11.2012
comment
@sealTrip: доступно, как и в git/contrib. Установите в Ubuntu с помощью sudo make install install-doc prefix=/usr libexecdir=/usr/lib/git-core из исходного дерева Git (не работает с упакованным Git). - person kynan; 23.11.2012

В настоящее время я использую подмодули для разработки, а не просто связываю сторонние библиотеки. Есть несколько способов упростить жизнь с помощью подмодулей, особенно когда они являются источником конфликтов слияния или перебазирования. Посмотрите на ls-tree, чтобы получить 2 коммита, вовлеченных в конфликт в подмодуле. Это, вероятно, самая сложная часть подмодулей для людей. На данный момент сценарии значительно упростят работу с этим. Будущие версии Git должны иметь лучшую встроенную поддержку для работы с ними.

Надеюсь это поможет.

person Adam Dymitruk    schedule 28.06.2011

Мы столкнулись с похожей проблемой при использовании подмодулей Git в проектах, где у нас были зависимости на разных языках. Чтобы справиться с ними, мы создали инструмент с открытым исходным кодом под названием MDLR («Модульный»), который дает вам декларативные зависимости Git с контролируемой версией с функциональностью, аналогичной подмодулям Git, но без раздражающего рабочего процесса. Вы можете установить его и управлять своими зависимостями с помощью инструкций/загрузок в репозитории GitHub

person svarlamov    schedule 18.07.2018

Для некоторых случаев использования мне понравился каждый из следующих двух простых подходов:

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

  • Репозитории для отдельных пакетов. Для программных проектов, в которых вы используете какую-либо систему управления пакетами с исходным кодом (gem/bundler, npm, pear и т. п.), имеет смысл поместить повторно используемый код в отдельные git-репозитории, затем делать из них исходные пакеты, а затем устанавливать их с помощью инструмента управления пакетами в родительский проект. Git-репозиторий вашего родительского проекта будет содержать только ссылки на необходимые пакеты и их версии, в то время как фактический код этих пакетов будет игнорироваться git, как и со всеми другими пакетами и внешними библиотеками. По сравнению с предложенными выше вложенными репозиториями, это более сложный подход, поскольку он позволяет указать, какая версия пакета должна быть установлена.

person tanius    schedule 23.09.2019