Почему подмодули git несовместимы с внешними svn?

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

Подмодули Git ссылаются на конкретный коммит в репозитории другого проекта, тогда как svn: externals всегда выбирает последнюю ревизию.

Почему это различие делает их настолько принципиально несовместимыми? Нет ли разумного значения по умолчанию, которое мы можем принять, например, что большинство svn: externals указывают на теги, которые никогда не перемещаются?


person Andres Jaan Tack    schedule 28.06.2010    source источник
comment
Обратите внимание, что, как подробно описано в stackoverflow.com/a/9189815/6309 и упоминается в моем обновленном ответе ниже, теперь подмодуль может отслеживать ветку последней.   -  person VonC    schedule 03.04.2013


Ответы (2)


Принципиальное отличие - это правило композиции.

В истинном компонентном подходе вы определяете конфигурация, то есть:
Список меток (коммитов SHA1 для Git), необходимых для того, чтобы ваш проект" работал "(т.е." разрабатывался "," скомпилировать "," развернуть ", ...).

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


Примечание для git1.8.2

«git submodule» начал изучать новый режим для интеграции с концом удаленной ветки (в отличие от интеграции с фиксацией, записанной в gitlink суперпроекта).

Так скоро (март 2013 г.) подмодуль может ссылаться на HEAD восходящего потока, а не только на фиксированный SHA1.


(До 1.8.2) На каждый модуль может быть только одна метка / SHA1. Из одного общего родительского репо вы не можете определить модуль внутри модуля.
(Но модуль, который является просто ссылкой на внешнее репозиторий Git, может иметь собственное определение подмодулей: родительское репо будет ссылаться только на первое- подмодуль уровня, который, в свою очередь, будет ссылаться на любые подмодули, которые он зафиксировал внутри себя)


Ничего подобного в внешнем SVN : вы можете определять внешние свойства каталога, а также внешний файл, с явной версией или без него.
Вы можете создавать различные внешние свойства. Например:

$ svn propget svn:externals calc
third-party/sounds             http://svn.example.com/repos/sounds
third-party/skins -r148        http://svn.example.com/skinproj
third-party/skins/toolkit -r21 http://svn.example.com/skin-maker

Результатом является не конфигурация (одна ссылка для 'calc'), а композиция правил выбора, которые определяют точное "лоскутное одеяло", которое вам нужно в каталоге 'calc'.


Короче говоря, вы не можете «вычислить» один SHA1 для подмодуля 'calc', который был бы точным эквивалентом набора свойств svn:external в каталоге SVN 'calc'.

person VonC    schedule 28.06.2010
comment
Примечание для себя: ClearCase - еще один пример VCS, позволяющий композицию в своем механизме выбора версии ... за исключением того, что он исключил такой режим с помощью своей более поздней методологии UCM: см. stackoverflow.com/questions/763099/ - person VonC; 28.06.2010
comment
Красиво написано. Но ... Когда вы проверяете родительский объект SVN, независимо от того, переместились внешние элементы или нет, вы ожидаете, что он скомпилируется и заработает. Разве мне не достаточно, по крайней мере, по умолчанию, хешировать эту конкретную ревизию, когда вы git svn clone родитель? - person Andres Jaan Tack; 29.06.2010
comment
@Andres: как бы вы тогда git svn dcommit? Как бы вы отодвинули любые изменения, которые вы могли сделать в части подмодулей вашего репозитория Git (см. Истинную природу подмодулей stackoverflow.com/questions/1979167/git-submodule-update/), что на самом деле соответствует нескольким репозиториям SVN, некоторые из них с явной ревизией не должны перемещаться? - person VonC; 29.06.2010
comment
Это все еще вызывает глубокое неудовлетворение. Я понимаю, что они разные, но не понимаю, почему не может быть автоматического обходного пути. - person Andres Jaan Tack; 08.07.2010

Если вы используете SmartGit для работы с репозиторием SVN с svn: externalls, вы не заметите какая-то реальная разница.

На самом деле, единственная реальная разница (по крайней мере, единственная техническая разница) заключается в том, что SVN позволяет внешним ссылкам указывать на ревизию HEAD (не фиксированное значение), а подмодуль Git - нет. Все остальные отличия, на мой взгляд, несущественны, поэтому вы правы, задавая этот вопрос.

person Dmitry Pavlenko    schedule 12.05.2012