Почему подмодули 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 - нет. Все остальные различия, на мой взгляд, незначительны, поэтому вы правильно задаете этот вопрос.