¿Por qué los submódulos de Git son incompatibles con SVN Externals?
git-svn git-submodules (2)
Hay muchas páginas web que sugieren formas de hacer que svn externals parezcan submódulos de git . He leído algunos informes sobre la diferencia, pero esto no parece muy fundamental:
Los submódulos de Git se vinculan a un compromiso particular en el repositorio de otro proyecto, mientras que svn: externals siempre obtienen la última revisión.
¿Por qué esta diferencia los hace tan fundamentalmente incompatibles? ¿No hay un incumplimiento razonable que podamos asumir, como que la mayoría de los svn: externals apuntan a etiquetas que nunca se mueven?
La diferencia fundamental es la regla de composición .
En un verdadero enfoque basado en componentes , define una configuración , es decir:
La lista de etiquetas (de SHA1 se compromete con Git) que necesita para que su proyecto "funcione" (es decir, "desarrollar", "compilar", "implementar", ...).
Cada confirmación a la que se hace referencia en una configuración lo ayuda a obtener las versiones exactas de todos los árboles. No hay excepción Cada archivo de ese árbol está en la versión exacta especificada por la configuración que ha definido.
Nota para git1.8.2
El "submódulo git" comenzó a aprender un nuevo modo para integrarse con la punta de la rama remota (en lugar de integrarse con la confirmación registrada en el gitlink del superproyecto).
Tan pronto (marzo de 2013), un submódulo podría hacer referencia a HEAD en sentido ascendente, y no solo a un SHA1 fijo.
(Antes 1.8.2) Solo puede haber una etiqueta / SHA1 por módulo. A partir de un repositorio primario común, no puede definir un módulo dentro de un módulo.
(Pero un módulo, que es solo una referencia a un repositorio de Git externo, puede tener su propia definición de submódulos: el repositorio principal solo referirá el submódulo de primer nivel, que a su vez hará referencia a los submódulos que haya cometido dentro de sí mismo)
No, en SVN externo : puede definir directorios externos así como archivos externos, con o sin una revisión explícita en él.
Puede componer varias propiedades externas. Por ejemplo:
$ 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
El resultado no es una configuración (una referencia para '' calc
''), sino una composición de reglas de selección que define el "mosaico" exacto que necesita en el directorio '' calc
''
En resumen, no se puede "calcular" un SHA1 para un submódulo '' calc
'' que sería el equivalente exacto de un conjunto de svn:external
propiedades svn:external
en un directorio SVN '' calc
''.
Si usa SmartGit para trabajar con el repositorio SVN con svn: externalls, no notará ninguna diferencia real.
En realidad, la única diferencia real (al menos la única diferencia técnica) es que SVN permite que el externo apunte a la revisión HEAD (no el valor fijo), el submódulo Git no lo hace. Todas las demás diferencias son, en mi opinión, insignificantes, por lo que tiene razón al hacer esta pregunta.