¿Cuáles son las diferencias conceptuales entre usar git submodule y subtree?
¿Cuáles son los escenarios típicos para cada uno?
git
git-submodules
git-subtree
Nathan H
fuente
fuente
Respuestas:
Solo mantiene referencias en su repositorio principal ( gitlinks , entradas especiales en el índice )
Puede hacer un submódulo para seguir el HEAD de una rama de un repositorio remoto de submódulo, con:
o
git submodule add -b <branch> <repository> [<path>]
. (para especificar una rama a seguir)o
git submodule update --remote
que actualizará el contenido del submódulo al último HEAD de<repository>/<branch>
forma predeterminadaorigin/master
. Sin embargo, su proyecto principal seguirá los hashes de HEAD del submódulo, incluso si--remote
se usa.Vea un ejemplo en esta respuesta .
fuente
add -b
y,--remote
posteriormente, en los comandos de actualización, según la documentación de actualización del submódulo . En ese caso, ¿-b
todavía se necesita realmente para seguir a HEAD of master?-b
se usa para generar los metadatos .gitmodule correctos para el submódulo (es equivalente a agit config -f .gitmodules submodule.<path>.branch <branch>
).--remote
:--remote
funciona también si-b
no se ha utilizadoadd
. En ambos casos, la actualización provocará una confirmación en el repositorio principal que aloja el submódulo, por lo que los enlaces realmente "no siempre apuntan al HEAD" de una manera muy automática ... o no lo entendí, o esa afirmación es mejor que se elimine de la respuesta original (?)submódulo es enlace;
subárbol es copia
fuente
La diferencia conceptual es:
Con los submódulos git , normalmente desea separar un repositorio grande en otros más pequeños. La forma de hacer referencia a un submódulo es de estilo maven : está haciendo referencia a una única confirmación del otro repositorio (submódulo). Si necesita un cambio dentro del submódulo, debe hacer un commit / push dentro del submódulo, luego hacer referencia al nuevo commit en el repositorio principal y luego commit / push la referencia cambiada del repositorio principal. De esa manera, debe tener acceso a ambos repositorios para la compilación completa.
Con git subtree integras otro repositorio en el tuyo, incluido su historial. Entonces, después de integrarlo, el tamaño de su repositorio es probablemente mayor (por lo que esta no es una estrategia para mantener los repositorios más pequeños). Después de la integración, no hay conexión con el otro repositorio, y no necesita acceso a él a menos que desee obtener una actualización. Entonces, esta estrategia es más para reutilizar el código y el historial; personalmente no la uso.
fuente
git subtree
contigo también puedes empujar, si quieres, ¿verdad?el submódulo que
empuja un repositorio principal a un control remoto no empuja los archivos del submódulo
el subárbol que
empuja un repositorio principal a remoto empuja los archivos del subárbol
fuente
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master