SVN: equivalentes externos en Git?

177

Tengo dos proyectos SVN en uso desde otro repositorio SVN usando svn: externals .

¿Cómo puedo tener la misma estructura de diseño de repositorio en Git?

dsimard
fuente
Deberías buscar en los submódulos de Git . Debería permitir casi exactamente lo que estás buscando.
foxxtrot
77
¿Alguien tiene una nueva respuesta a esto en los últimos 4 años, o el mundo de git es el mismo hoy?
DougW
44
@DougW Sí, tengo una nueva respuesta a continuación : git submoduleahora puedo emular svn:external(desde marzo de 2013).
VonC
Para la última versión de Git, sugiero leer sobre los submódulos de Git en la documentación oficial de Git.
Bulki S Maslom

Respuestas:

134

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

  • Las fusiones de subárbol insertan el código del proyecto externo en un subdirectorio separado dentro de su repositorio. Esto tiene un proceso detallado para configurar y luego es muy fácil para otros usuarios, ya que se incluye automáticamente cuando el depósito se extrae 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 enviarlos nuevamente. Y si el otro proyecto tiene que fusionarse a partir de su código, los historiales del proyecto se fusionan y los dos proyectos se convierten efectivamente en uno.

  • Los submódulos de Git ( manual ) se vinculan a un commit particular en el repositorio de otro proyecto, al igual que svn: externos con un-rargumento. 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 los pagos (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 está en desarrollo activo.

Pablo
fuente
17
Para su información, ahora es posible especificar revisiones específicas con svn: externos ahora (¿desde 1.5 o 1.6, creo?)
Nate Parsons
9
Para su información, los submódulos de git se pueden administrar y confirmar automáticamente. git crea un archivo .gitmodules que puede / debe confirmarse al igual que el archivo .gitignore. Consulte [ git-scm.com/book/en/Git-Tools-Submodules] para obtener más información.
mikijov
55
@NateParsons Siempre ha sido posible especificar números de revisión exactos con svn:externals. Con la revisión 1.5, la sintaxis se cambió a un formato más flexible. Lo que se agregó fue el direccionamiento relativo de URL.
David W.
@NateParsons pero es posible omitir revisiones con submódulos git ...> _>
Trejkaz
Creo que no es posible obtener submódulos de archivos individuales como con svn: externals
user1911091
38

Como mencioné en " Actualización de la nueva versión del submódulo Git ", puede lograr la misma función externa SVN con los submódulos Git 1.8.2:

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

Esto es suficiente para que un submódulo siga una bifurcación (como en el ÚLTIMO compromiso de una bifurcación remota de un repositorio ascendente de submódulo ). Todo lo que necesitas hacer es:

git submodule update --remote

Eso actualizará el submódulo.

Más detalles están en " git submoduleseguimiento más reciente ".

Para convertir un submódulo existente en uno que rastrea una rama : consulte todos los pasos en " Submódulos Git: especifique una rama / etiqueta ".

VonC
fuente
¿Se puede hacer un pago parcial como con svn:externals?
nowox
@nowox Sí, puede tener un pago escaso (git 1.7+ stackoverflow.com/a/2372044/6309 ) asociado a submódulos ( stackoverflow.com/a/17693008/6309 )
VonC
desafortunadamente, todas las respuestas relacionadas con el pago escaso nunca dan ningún ejemplo :( Trataré de escribir un ejemplo de Gist para esto ...
nowox
Todavía hay un problema con esto. Todavía tiene que obtener toda la historia de un repositorio donde solo necesita una pequeña parte. En mi caso es de 100kB sobre 2GB. Por supuesto, puedo usar, --depthpero en realidad no aborda el problema.
nowox
@nowox Es mejor hacer una nueva pregunta que explique exactamente cuál es su caso de uso: no tengo idea si su repositorio de 2GB es un submódulo, o un repositorio principal con submódulo, y qué es exactamente lo que necesita extraer de él.
VonC
3

Soy el autor de la herramienta gil (git links)

Tengo una solución alternativa para el problema: herramienta gil (git links)

Permite describir y administrar dependencias complejas de repositorios git.

También proporciona una solución al problema de dependencia de submódulos recursivos git .

Considere que tiene las siguientes dependencias del proyecto: ejemplo de gráfico de dependencia del repositorio git

Luego puede definir el .gitlinksarchivo con la descripción de la relación de repositorios:

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

Cada línea describe el enlace git en el siguiente formato:

  1. Nombre único del repositorio
  2. Ruta relativa del repositorio (iniciada desde la ruta del archivo .gitlinks)
  3. Repositorio de Git que se usará en el comando git clone Repositorio de rama para pagar
  4. La línea vacía o la línea que comienza con # no se analiza (se trata como un comentario).

Finalmente, debe actualizar su repositorio de muestras raíz:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

Como resultado, clonarás todos los proyectos necesarios y los vincularás entre sí de la manera adecuada.

Si desea confirmar todos los cambios en algún repositorio con todos los cambios en los repositorios vinculados secundarios, puede hacerlo con un solo comando:

gil commit -a -m "Some big update"

Los comandos pull, push funcionan de manera similar:

gil pull
gil push

La herramienta Gil (enlaces git) admite los siguientes comandos:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

Más información sobre el problema de dependencia de submódulos recursivos git .

cronoxor
fuente
1
Debes poner un descargo de responsabilidad en la parte superior de la publicación diciendo que eres el autor de gil.
Daniel Kamil Kozar