Вам следует четко отметить, о чем вы говорите, когда используете термин 'поддерево' в контексте git
, поскольку на самом деле здесь есть две отдельные, но связанные темы:
git-subtree и стратегия слияния поддеревьев git.
TL; DR
Обе концепции, связанные с поддеревом, позволяют эффективно управлять несколькими репозиториями в одном. В отличие от git-submodule, где в корневом репозитории хранятся только метаданные в форме из .gitmodules, и вы должны управлять внешними репозиториями отдельно.
Подробнее
Стратегия слияния поддеревьев git - это, по сути, более ручной метод с использованием команд, на которые вы ссылались.
git-subtree - это сценарий оболочки-оболочки, обеспечивающий более естественный синтаксис. На самом деле это все еще часть contrib
и не полностью интегрировано в git с обычными страницами руководства. Вместо этого документация хранится вместе со скриптом. .
Вот информация об использовании:
NAME
----
git-subtree - Merge subtrees together and split repository into subtrees
SYNOPSIS
--------
[verse]
'git subtree' add -P <prefix> <commit>
'git subtree' add -P <prefix> <repository> <ref>
'git subtree' pull -P <prefix> <repository> <ref>
'git subtree' push -P <prefix> <repository> <ref>
'git subtree' merge -P <prefix> <commit>
'git subtree' split -P <prefix> [OPTIONS] [<commit>]
Я наткнулся на довольно много ресурсов по теме поддеревьев, так как планировал написать собственное сообщение в блоге. Я обновлю этот пост, если я это сделаю, но сейчас вот некоторая информация, имеющая отношение к рассматриваемому вопросу:
Многое из того, что вы ищете, можно найти на этом Atlassian blog Никола Паолуччи в соответствующем разделе ниже:
Зачем использовать поддерево вместо подмодуля?
Есть несколько причин, по которым вам может показаться, что subtree
лучше использовать:
- Управлять простым рабочим процессом легко.
- Поддерживаются более старые версии
git
(даже до v1.5.2
).
- Код подпроекта доступен сразу после завершения
clone
суперпроекта.
subtree
не требует от пользователей вашего репозитория изучения чего-либо нового, они могут игнорировать тот факт, что вы используете subtree
для управления зависимостями.
subtree
не добавляет новые файлы метаданных, как submodules
(т. Е. .gitmodule
).
- Содержимое модуля может быть изменено без наличия отдельной копии репозитория зависимости где-либо еще.
На мой взгляд, недостатки допустимы:
- Вы должны узнать о новой стратегии слияния (например,
subtree
).
- Вернуть код
upstream
для подпроектов немного сложнее.
- Ответственность за то, чтобы не смешивать код суперпроекта и подпроекта в коммитах, лежит на вас.
Я бы тоже согласился со многими из этого. Я бы порекомендовал ознакомиться со статьей, поскольку в ней рассказывается о некоторых типичных применениях.
Вы могли заметить, что он также написал продолжение здесь, где он упоминает важную деталь, которая отсутствует в этом подходе ...
git-subtree
в настоящее время не может включить пульт!
Эта близорукость, вероятно, связана с тем, что люди часто добавляют пульт вручную при работе с поддеревьями, но это также не сохраняется в git. Автор подробно описывает патч, который он написал, чтобы добавить эти метаданные в коммит, который git-subtree
уже генерирует. Пока это не станет официальной основной веткой git, вы можете сделать что-то подобное, изменив сообщение коммита или сохранив его в другом коммите.
Я также считаю очень информативным этот пост в блоге. Автор добавляет в смесь третий метод поддерева, который он называет git-stree
. Статью стоит прочитать, так как он неплохо сравнивает три подхода. Он высказывает свое личное мнение о том, что ему нравится, а что нет, и объясняет, почему он создал третий подход.
Дополнительно
Заключительные мысли
В этом разделе показаны как мощь git
, так и сегментация, которая может произойти, когда функция просто не попадает в цель.
Я лично вызвал отвращение к git-submodule
, так как считаю его более запутанным для понимания участниками. Я также предпочитаю, чтобы ВСЕ мои зависимости управлялись в моих проектах, чтобы упростить воспроизводимую среду, не пытаясь управлять несколькими репозиториями. git-submodule
, однако, в настоящее время гораздо более известен, поэтому, очевидно, хорошо знать об этом и зависит от вашей аудитории, которая может повлиять на ваше решение.
person
Matthew Sanders
schedule
07.11.2015
submodule
, иsubtree
более или менее достигают одной и той же цели, которая включает связанные проекты, и что единственная разница в том, чтоsubmodule
может быть немного менее прозрачным, а обновление подмодулей - это двухэтапная операция, и что недостаток изsubtree
в том, что сообщения о фиксации будут смешиваться между двумя проектами? - person Lernkurve   schedule 06.09.2015subtree
s, и в зависимости была введена ошибка, вы найдете точную фиксацию вsubtree
, которая привела к ошибке. С подмодулями вы обнаружите только, что фиксация, которая изменяетsubmodule
, вызывает ошибку, и вы вроде как SOL, если хотите быстро найти, какая фиксация вsubmodule
вызывает ошибку в вашем основном проекте. - person cyphar   schedule 07.09.2015