Подмодуль Git против клона Git

18

Я работаю над проектом с открытым исходным кодом на GitHub.

У него есть подкаталог / Vendor, в котором имеется копия нескольких внешних библиотек. Оригинальный сопровождающий проекта время от времени обновлял этот каталог новой версией внешней библиотеки.

Один разработчик отправил мне запрос на удаление с идеей заменить эту копию на подмодуль git .

И я обдумываю, хорошая это идея или нет.

Git submodule Плюсы:

  • Подмодули были специально разработаны для аналогичных сценариев
  • Это исключает возможность случайной фиксации Vendor, которая будет перезаписана при следующем обновлении.

Подмодуль Git Минусы:

  • Похоже, что подмодули git переносят сложность от сопровождающего к человеку, который будет клонировать / извлекать проект (после того, как вы клонируете, чтобы начать работу с проектом, требуются дополнительные шаги: «инициализация подмодуля git», «обновление подмодуля git»)

Каково ваше мнение по этому поводу?

Еще кое-что. Эта проблема - библиотека небольшого размера с очень ограниченными внешними зависимостями. Я думаю, что любой инструмент для сборки был бы излишним для этого сейчас.

Виктор Ронин
источник
4
В качестве альтернативы они могут выполнять, git clone --recursiveа затем не нужно выполнять команды субмодуля. Никто другой не упомянул этот лакомый кусочек; большинство людей, которых я знаю, имеют субмодули, рекламируют это в README.
Леви Моррисон

Ответы:

9

Альтернативой субмодулю является использование git subtree. Это дает преимущества, git submoduleно без увеличения сложности для конечного пользователя. Сторонний репозиторий объединен с основным деревом проекта, но метаданные хранятся таким образом, что вы можете:

  • извлечь сторонний репозиторий позже, если были внесены какие-либо интересные изменения
  • объединять новые обновления из стороннего хранилища (примечание объединять , а не перезаписывать)

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

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

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

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

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

Обратите внимание, что git-subtree является частью git/contribкаталога и должен быть установлен отдельно.

Грег Хьюгилл
источник
4

Недостатком использования подмодулей является то, что tar-архивы или zip-архивы на Github (и многих других сервисах) не включают источники подмодулей. То есть архивы не являются автономными. Это проблема, если репозиторий небольшой и на самом деле не имеет сценария сборки, как статический HTML-сайт в зависимости от библиотеки JavaScript.

Lekensteyn
источник
3

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

Их нетрудно понять, как их использовать, и они довольно часто используются в этой ситуации, поэтому просто отметьте в README проекта, что вы используете субмодули и что делать, и люди должны иметь возможность понять это из. В первый раз, когда я столкнулся с репозиторием с подмодулем, я запустил его и запустил через 10-15 минут, и у меня никогда не возникало проблем с выяснением того, что делать с тех пор.

Джонатан Патт
источник
1
В качестве дополнения к этому, если ваше приложение не инициализируется, вы можете поставить проверку на место, чтобы убедиться, что субмодуль был инициализирован - и предоставить дружественное сообщение об ошибке, если это не так.
Джонатан Рич
1
Также смотрите ответ Лекенштейна о том, что в zip-архивах отсутствуют файлы субмодулей. Это означает, что подмодули, возможно, не лучший подход, если вы предоставляете код публично, но подходят для частного кода, который гарантированно будет клонирован. В противном случае, предпочитайте поддеревья.
инженер
3

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

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

Шон Максомт
источник
6
Подмодули не мешают вам делать локальные изменения. Напротив, они позволяют отслеживать эти изменения и использовать разные версии (ваши настройки или выпуски библиотеки) библиотеки в разных проектах.
Стив Фэллоуз