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?
git submodule
ahora puedo emular svn:external
(desde marzo de 2013).
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?
git submodule
ahora puedo emular svn:external
(desde marzo de 2013).
Respuestas:
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-r
argumento. 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.
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.
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 submodule
seguimiento 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 ".
svn:externals
?
--depth
pero en realidad no aborda el problema.
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 .gitlinks
archivo 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:
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 .
gil
.