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

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

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

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

2 ответа

Решение

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

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

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


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

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

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


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


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

$ 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 свойства на 'calc'SVN каталог.

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

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

Другие вопросы по тегам