Debe tener cuidado de anotar explícitamente de qué está hablando cuando usa el término 'subárbol' en el contexto de, git
ya que en realidad hay dos temas separados pero relacionados aquí:
Estrategia de fusión de git-subtree y git subtree .
El TL; DR
Ambos conceptos relacionados con los subárboles le permiten gestionar de forma eficaz varios repositorios en uno. A diferencia de git-submodule, donde solo los metadatos se almacenan en el repositorio raíz, en forma de .gitmodules , y debe administrar los repositorios externos por separado.
Más detalles
La estrategia de fusión de subárboles de git es básicamente el método más manual que utiliza los comandos a los que hizo referencia.
git-subtree es un script de shell contenedor para facilitar una sintaxis más natural. En realidad, esto sigue siendo parte de contrib
git y no está completamente integrado en las páginas de manual habituales. En cambio, la documentación se almacena junto con el script.
Aquí está la información de uso:
NAME
----
git-subtree - Merge subtrees together and split repository into subtrees
SYNOPSIS
--------
[verse]
'git subtree' add -P <prefix> <commit>
'git subtree' add -P <prefix> <repository> <ref>
'git subtree' pull -P <prefix> <repository> <ref>
'git subtree' push -P <prefix> <repository> <ref>
'git subtree' merge -P <prefix> <commit>
'git subtree' split -P <prefix> [OPTIONS] [<commit>]
Me he encontrado con una buena cantidad de recursos sobre el tema de los subárboles, ya que estaba planeando escribir una publicación de blog propia. Actualizaré esta publicación si lo hago, pero por ahora aquí hay información relevante para la pregunta en cuestión:
Mucho de lo que está buscando se puede encontrar en este blog de Atlassian de Nicola Paolucci, la sección correspondiente a continuación:
¿Por qué utilizar subárbol en lugar de submódulo?
Hay varias razones por las que puede que le resulte subtree
mejor utilizar:
- La gestión de un flujo de trabajo sencillo es sencilla.
git
Se admiten versiones anteriores de (incluso antes v1.5.2
).
- El código del subproyecto está disponible justo después
clone
de que se realiza el superproyecto.
subtree
no requiere que los usuarios de su repositorio aprendan nada nuevo, pueden ignorar el hecho de que está utilizando subtree
para administrar dependencias.
subtree
no agrega nuevos archivos de metadatos como lo submodules
hace (es decir
.gitmodule
).
- El contenido del módulo se puede modificar sin tener una copia de repositorio separada de la dependencia en otro lugar.
En mi opinión, los inconvenientes son aceptables:
- Debe aprender sobre una nueva estrategia de fusión (es decir
subtree
).
- Contribuir con el código
upstream
para los subproyectos es un poco más complicado.
- La responsabilidad de no mezclar código de superproyecto y subproyecto en las confirmaciones recae en usted.
También estaría de acuerdo con gran parte de esto. Recomendaría consultar el artículo ya que trata sobre algunos usos comunes.
Es posible que haya notado que también ha escrito un seguimiento aquí donde menciona un detalle importante que se deja fuera de este enfoque ...
git-subtree
¡actualmente no incluye el control remoto!
Esta miopía probablemente se deba al hecho de que las personas a menudo agregan un control remoto manualmente cuando se trata de subárboles, pero esto tampoco se almacena en git. El autor detalla un parche que ha escrito para agregar estos metadatos al compromiso que git-subtree
ya genera. Hasta que esto se convierta en la línea principal oficial de git, puede hacer algo similar modificando el mensaje de confirmación o almacenándolo en otra confirmación.
También encuentro esta publicación de blog muy informativa. El autor agrega un tercer método de subárbol que llama git-stree
a la mezcla. Vale la pena leer el artículo ya que hace un buen trabajo comparando los tres enfoques. Da su opinión personal de lo que le gusta y lo que no le gusta y explica por qué creó el tercer enfoque.
Extras
Pensamientos finales
Este tema muestra tanto el poder git
como la segmentación que puede ocurrir cuando una característica simplemente no da en el blanco.
Personalmente, he creado un disgusto por lo git-submodule
que me resulta más confuso de entender para los contribuyentes. También prefiero mantener TODAS mis dependencias administradas dentro de mis proyectos para facilitar un entorno fácilmente reproducible sin tratar de administrar múltiples repositorios. git-submodule
, sin embargo, es mucho más conocido en la actualidad, por lo que obviamente es bueno estar al tanto y dependiendo de su audiencia, eso puede influir en su decisión.