Почему подмодули git несовместимы с внешними svn? - PullRequest
13 голосов
/ 28 июня 2010

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

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

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

Ответы [ 2 ]

10 голосов
/ 28 июня 2010

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

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

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


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

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

Так скоро (март 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.

3 голосов
/ 13 мая 2012

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

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

...