2009-02-20 32 views
154

Tengo dos proyectos SVN en uso desde otro repositorio SVN usando svn:externals.SVN: ¿equivalente externo en Git?

¿Cómo puedo tener la misma estructura de disposición de repositorio en Git?

+7

Alguien tiene una nueva respuesta a esto en los últimos 4 años, ¿o es el mundo de git lo mismo hoy? – DougW

+3

@DougW Sí, tengo una [nueva respuesta a continuación] (http://stackoverflow.com/a/18088319/6309): 'git submodule' ahora puede emular' svn: external' (desde marzo de 2013). – VonC

Respuesta

116

Git tiene dos enfoques similares a, pero no exactamente equivalentes a svn: externals:

  • subárbol fusiona insertar el código del proyecto externo en un subdirectorio separado dentro de tu repositorio. Esto tiene un detailed process to set up y luego es muy fácil para otros usuarios, porque se incluye automáticamente cuando el repositorio se retira o se clona. Esta puede ser una forma conveniente de incluir una dependencia en su proyecto.
    Es fácil extraer los cambios del otro proyecto, pero es complicado devolver los cambios. Y si el otro proyecto tiene que fusionarse con su código, los historiales del proyecto se fusionan y los dos proyectos se convierten efectivamente en uno.

  • Git submodules (manual) Enlace a un particular, se comprometen en el repositorio de otro proyecto, al igual que svn: externos con un argumento -r. Los submódulos son fáciles de configurar, pero todos los usuarios tienen que administrar los submódulos, que no se incluyen automáticamente en las cajas (o clones).
    Aunque es fácil enviar cambios al otro proyecto, hacerlo puede causar problemas si el repositorio ha cambiado. Por lo tanto, generalmente no es apropiado enviar los cambios a un proyecto que se encuentra en desarrollo activo.

+16

FYI, ahora es posible especificar revisiones específicas con svn: externals ahora (¿desde 1.5 o 1.6 creo?) –

+5

Como los enlaces en la respuesta están desactualizados, aquí hay algunos nuevos: [Subtree Merge @ Github: help] (http://help.github.com/subtree-merge/); [Trabajando con submódulos @ Github: ayuda] (http://help.github.com/submodules/); [Manual de usuario de Submódulos @ Git] (http://schacon.github.com/git/user-manual.html#submodules) – Bart

+6

Para su información, los submódulos de git se pueden administrar y comprometer automáticamente. git crea un archivo .gitmodules que puede/debe ser enviado como el archivo .gitignore. Ver [http://git-scm.com/book/en/Git-Tools-Submodules] para más información. – mikijov

6

Usted debe mirar en Git submodules. Debe permitir casi exactamente lo que estás buscando.

+0

@JonathonReinhart - Hice la edición – Sonny

27

Como menciono en "Git submodule new version update", se puede lograr la misma función SVN externa con Git 1.8.2 submódulos:

git config -f .gitmodules submodule.<path>.branch <branch> 

Esto es suficiente para un submódulo a seguir una rama (como en la última confirmación de una rama remota de un submódulo upstream repo). Todo lo que necesita hacer es un:

git submodule update --remote 

Eso actualizará el submódulo.

Más detalles están en "git submodule tracking latest".

para convertir un submódulo existentes en un seguimiento de una rama: ver todos los pasos de "Git submodules: Specify a branch/tag".

+0

¿Se puede hacer una salida parcial como con 'svn: externals'? – nowox

+0

@nowox Sí, puede tener un checkout disperso (git 1.7+ https://stackoverflow.com/a/2372044/6309) asociado a los submódulos (https://stackoverflow.com/a/17693008/6309) – VonC

+0

desafortunadamente todo el respuestas raras relacionadas con el pago nunca dan ningún ejemplo :(Trataré de escribir un ejemplo Gist para esto ... – nowox

1

Para la última versión de Git, sugeriría leer sobre Git submodules en la documentación oficial de Git.