Por que os submódulos git são incompatíveis com o svn externals?

Há muitas páginas da web por aí sugerindo maneiras de fazer com que os svn externals se pareçam com submódulos git . Eu li alguns relatos de qual é a diferença, mas isso não parece muito fundamental:

Os submódulos do Git se ligam a um commit particular no repository de outro projeto, enquanto o svn: externals sempre busca a revisão mais recente.

Por que essa diferença os torna tão fundamentalmente incompatíveis? Não existe um padrão razoável que podemos assumir, como o de que a maioria dos svn: externals apontam para tags que nunca se movem?

A diferença fundamental é a regra de composição .

Em uma abordagem baseada em componente real, você define uma configuração , ou seja:
A lista de labels (de SHA1 commits para Git) você precisa para o seu projeto “funcionar” (ou seja, “desenvolver”, “compilar”, “implantar”, …).

Cada confirmação referenciada em uma configuração ajuda você a obter as versões exatas de todas as trees. Não há exceção. Cada arquivo dessa tree está na versão exata especificada pela configuração que você definiu.


Nota para git1.8.2

“git submodule” começou a aprender um novo modo para integrar com a ponta do branch remoto (ao invés de integrar com o commit gravado no gitlink do superprojeto).

Então, em breve (março de 2013), um submódulo poderia referenciar uma CABEÇA a montante, e não apenas uma SHA1 fixa.


(Antes da 1.8.2) Pode haver apenas uma etiqueta / SHA1 por módulo. De um repository pai comum, você não pode definir um módulo dentro de um módulo.
(Mas um módulo, que é apenas uma referência a um repository externo do Git, pode ter sua própria definição de submódulos: o repository pai apenas referenciará o submódulo de primeiro nível, que por sua vez fará referência a quaisquer submódulos que tenha sido internamente)


Não no SVN externo : você pode definir diretórios externos, assim como arquivos externos, com ou sem uma revisão explícita.
Você pode compor várias propriedades externas. Por exemplo:

$ 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 

O resultado não é uma configuração (uma referência para ‘ calc ‘), mas uma composição de regras de seleção que definem o “patchwork” exato que você precisa no diretório ‘ calc


Em suma, você não pode “computar” um SHA1 para um submódulo ” calc ” que seria o equivalente exato de um conjunto de propriedades svn:external em um diretório SVN ‘ calc ‘.

Se você usar o SmartGit para trabalhar com o repository SVN com o svn: externalls, você não notará nenhuma diferença real.

Na verdade, a única diferença real (pelo menos a única diferença técnica) é que o SVN permite que o externo aponte para a revisão HEAD (não o valor fixo), o submódulo do Git não. Todas as outras diferenças são, na minha opinião, insignificantes, então você está certo em fazer esta pergunta.