2010-06-28 15 views
14

Hay muchas páginas web que sugieren hackish ways to make svn externals look like git submodules. He leído some accounts de cuál es la diferencia, pero esto no parece muy fundamental:¿Por qué los submódulos de Git son incompatibles con SVN Externals?

Git submódulos enlace a un particular, se comprometen en el repositorio de otro proyecto, mientras que svn: externos siempre traen 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?

+0

Tenga en cuenta que, como se detalla en http://stackoverflow.com/a/9189815/6309 y mencionado en mi respuesta actualizada a continuación, un submódulo ahora puede realizar un seguimiento de una rama más reciente. – VonC

Respuesta

10

La diferencia fundamental es regla de composición.

En una verdadera enfoque basado en componentes, se define una configuration, es decir:
La lista de etiquetas (de SHA1 se compromete a Git) que necesita para su proyecto de "trabajar" (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

"git submódulo" comenzado a aprender un nuevo modo de integrar con la punta de la rama remota (en oposición a la integración a la confirmación registrada en gitlink del SuperProject) .

Tan pronto (marzo de 2013), un submódulo podría hacer referencia a un HEAD cadena arriba, 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 referenciará los submódulos que haya cometido dentro de sí mismo)


No se lo que en SVN external: puede definir los directorios externos, así como archivos externos, con o sin una revisión explícita en ella.
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 '), pero una composición de reglas de selección que definen 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 grupo de svn:external propiedades en un directorio 'calc' SVN.

+0

Nota a la libre: ClearCase es otro ejemplo de VCS permitiendo composición en su mecanismo de selección de la versión ... excepto que ha desterrado tal modo con su metodología más reciente UCM: ver http://stackoverflow.com/questions/763099/flexible- vs-static-branching-git-vs-clearcase-accurev/764219 # 764219 – VonC

+0

Muy bien escrito. Pero ... Cuando está revisando el padre SVN, ya sea que los externos se hayan movido o no, usted espera que compile y funcione. Entonces, ¿no sería suficiente, al menos por defecto, hacer hash esa revisión en particular, cuando 'git svn clone' el padre? –

+0

@Andres: ¿cómo harías 'git svn dcommit' entonces? ¿Cómo te hacer retroceder a cualquier cambio que podría haber hecho dentro de la parte "submódulo" de tu repositorio Git (ver "verdadera naturaleza de submódulos" http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194), que en realidad corresponden a varios repositorios SVN, algunos de ellos con una revisión explícita que no se supone que se muevan? – VonC

3

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.

Cuestiones relacionadas