Nuevo en el próximo git1.8.4 (julio de 2013) :
" git submodule update
" opcionalmente puede clonar los repositorios de submódulos poco profundos.
(Y git 2.10 Q3 2016 permite grabar eso con git config -f .gitmodules submodule.<name>.shallow true
.
Ver el final de esta respuesta)
Ver commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Agregue la --depth
opción a los comandos agregar y actualizar de "git submodule", que luego se pasa al comando clonar. Esto es útil cuando los submódulos son enormes y no estás realmente interesado en nada más que la última confirmación.
Se agregaron pruebas y se hicieron algunos ajustes de sangría para ajustarse al resto del archivo de prueba en "la actualización de submódulos puede manejar enlaces simbólicos en pwd".
Firmado por: Fredrik Gustafsson <iveqy@iveqy.com>
Acked: Jens Lehmann<Jens.Lehmann@web.de>
Eso significa que esto funciona:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Con:
--depth::
Esta opción es válida para add
y update
comandos.
Cree un clon 'superficial' con un historial truncado al número especificado de revisiones.
atwyman agrega en los comentarios :
Por lo que puedo decir, esta opción no es utilizable para submódulos que no siguen master
muy de cerca. Si establece la profundidad 1, submodule update
solo puede tener éxito si el compromiso de submódulo que desea es el último maestro. De lo contrario, obtienes " fatal: reference is not a tree
" .
Eso es verdad.
Es decir, hasta git 2.8 (marzo de 2016). Con 2.8, submodule update --depth
tiene una oportunidad más de tener éxito, incluso si se puede acceder directamente al SHA1 desde uno de los HEADs de repositorio remotos.
Ver commit fb43e31 (24 de febrero de 2016) por Stefan Beller ( stefanbeller
) .
Ayudado por: Junio C Hamano ( gitster
) .
(Fusionada por Junio C Hamano - gitster
- en commit 9671a76 , 26 de febrero de 2016)
submódulo: intente más difícil obtener sha1 necesario mediante la obtención directa de sha1
Al revisar un cambio que también actualiza un submódulo en Gerrit, una práctica de revisión común es descargar y seleccionar el parche localmente para probarlo.
Sin embargo, al probarlo localmente, ' git submodule update
' puede fallar al buscar el submódulo sha1 correcto, ya que la confirmación correspondiente en el submódulo aún no es parte del historial del proyecto, sino que también es solo un cambio propuesto.
Si $sha1
no formaba parte de la recuperación predeterminada, intentamos recuperarla $sha1
directamente . Sin embargo, algunos servidores no admiten la búsqueda directa por sha1, lo que lleva git-fetch
a fallar rápidamente.
Podemos fallar aquí, ya que el sha1 aún faltante llevaría a una falla más adelante en la etapa de pago de todos modos, por lo que fallar aquí es lo mejor que podemos obtener.
MVG señala en los comentarios para cometer fb43e31 (git 2.9, feb 2016)
Me parece que commit fb43e31 solicita el commit faltante por ID SHA1, por lo que la configuración uploadpack.allowReachableSHA1InWant
y uploadpack.allowTipSHA1InWant
en el servidor probablemente afectará si esto funciona.
Escribí una publicación en la lista de git hoy , señalando cómo se puede hacer que el uso de submódulos superficiales funcione mejor para algunos escenarios, es decir, si el commit también es una etiqueta.
Vamos a esperar y ver.
Supongo que esta es una razón por la cual fb43e31 hizo que la búsqueda de un SHA1 específico sea una alternativa después de la búsqueda de la rama predeterminada.
Sin embargo, en el caso de "--depth 1" creo que tendría sentido abortar antes de tiempo: si ninguna de las referencias enumeradas coincide con la solicitada, y el servidor no admite las preguntas de SHA1, entonces no tiene sentido buscar cualquier cosa, ya que no podremos satisfacer el requisito de submódulo de ninguna manera.
Actualización de agosto de 2016 (3 años después)
Con Git 2.10 (Q3 2016), podrás hacer
git config -f .gitmodules submodule.<name>.shallow true
Consulte " Submódulo Git sin peso adicional " para obtener más información.
Git 2.13 (Q2 2017) agrega commit 8d3047c (19 abr 2017) por Sebastian Schuberth ( sschuberth
) .
(Fusionada por Sebastian Schuberth - sschuberth
- en commit 8d3047c , 20 abr 2017)
un clon de este submódulo se realizará como un clon superficial (con una profundidad de historial de 1)
Sin embargo, Ciro Santilli agrega en los comentarios (y detalles en su respuesta )
shallow = true
en .gitmodules
sólo afecta a la referencia seguido por el jefe del mando a distancia cuando se utiliza --recurse-submodules
, incluso si el objetivo cometer es apuntado por una rama, e incluso si se pone branch = mybranch
en el .gitmodules
también.
Git 2.20 (Q4 2018) mejora el soporte de submódulos, que se ha actualizado para leer desde el blob HEAD:.gitmodules
cuando .gitmodules
falta el archivo del árbol de trabajo.
Consulte commit 2b1257e , commit 76e9bdc (25 de octubre de 2018) y commit b5c259f , commit 23dd8f5 , commit b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 (05 de octubre de 2018) por Antonio Ospite ( ao2
) .
(Fusionada por Junio C Hamano - gitster
- en commit abb4824 , 13 de noviembre de 2018)
submodule
: admite lectura .gitmodules
cuando no está en el árbol de trabajo
Cuando el .gitmodules
archivo no esté disponible en el árbol de trabajo, intente usar el contenido del índice y de la rama actual.
Esto cubre el caso cuando el archivo es parte del repositorio pero, por alguna razón, no está desprotegido, por ejemplo, debido a un pago escaso.
Esto hace posible utilizar al menos los git submodule
comandos ' ' que leen el gitmodules
archivo de configuración sin llenar completamente el árbol de trabajo.
Escribir en .gitmodules
todavía requerirá que el archivo esté desprotegido, así que verifíquelo antes de llamar config_set_in_gitmodules_file_gently
.
Agregue una verificación similar también git-submodule.sh::cmd_add()
para anticipar la falla eventual del git submodule add
comando " " cuando .gitmodules
no se puede escribir de forma segura; esto evita que el comando deje el repositorio en un estado espurio (por ejemplo, el repositorio de submódulos se clonó pero .gitmodules
no se actualizó porque config_set_in_gitmodules_file_gently
falló).
Además, dado que config_from_gitmodules()
ahora accede al almacén de objetos global, es necesario proteger todas las rutas de código que llaman a la función contra el acceso concurrente al almacén de objetos global.
Actualmente esto solo ocurre en builtin/grep.c::grep_submodules()
, así que llame
grep_read_lock()
antes de invocar el código que involucra config_from_gitmodules()
.
NOTA: hay un caso raro en el que esta nueva característica aún no funciona correctamente: submódulos anidados sin .gitmodules
en su árbol de trabajo.
Nota: Git 2.24 (Q4 2019) corrige un posible segfault al clonar un submódulo superficial.
Ver commit ddb3c85 (30 Sep 2019) por Ali Utku Selen ( auselen
) .
(Fusionada por Junio C Hamano - gitster
- en commit 678a9ca , 09 oct 2019)
Git 2.25 (Q1 2020), aclara la git submodule update
documentación.
Ver commit f0e58b3 (24 Nov 2019) por Philippe Blain ( phil-blain
) .
(Fusionada por Junio C Hamano - gitster
- en commit ef61045 , 05 dic 2019)
doc
: mencione que 'git submodule update' recupera commits faltantes
Ayudado por: Junio C Hamano
Ayudado por: Johannes Schindelin
Firmado por: Philippe Blain
' git submodule
actualizar' obtendrá nuevas confirmaciones del submódulo remoto si no se encuentra el SHA-1 registrado en el superproyecto . Esto no fue mencionado en la documentación.
Advertencia: con Git 2.25 (Q1 2020), la interacción entre " git clone --recurse-submodules
" y el almacén de objetos alternativos estaba mal diseñada.
La documentación y el código se han enseñado a hacer recomendaciones más claras cuando los usuarios ven fallas.
Ver commit 4f3e57e , commit 10c64a0 (02 dic 2019) por Jonathan Tan ( jhowtan
) .
(Fusionada por Junio C Hamano - gitster
- en commit 5dd1d59 , 10 dic 2019)
submodule--helper
: avisar sobre error alternativo fatal
Firmado por: Jonathan Tan
Acked: Jeff King
Cuando .gitmodules
se clona de forma recursiva un superproyecto con algunos módulos poco profundos definidos en él , luego se reclonan con " --reference=<path>
", se produce un error. Por ejemplo:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
falla con:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Cuando no se puede agregar una alternativa calculada a partir de la alternativa del superproyecto, ya sea en este caso u otro, aconseje sobre la configuración de la " submodule.alternateErrorStrategy
" opción de configuración y el uso de " --reference-if-able
" en lugar de " --reference
" al clonar.
Eso se detalla en:
Con Git 2.25 (Q1 2020), la interacción entre "git clone --recurse-submodules" y la tienda de objetos alternativos fue mal diseñada.
Doc
: explique submodule.alternateErrorStrategy
Firmado por: Jonathan Tan
Acked: Jeff King
Commit 31224cbdc7 (" clone
: la opción recursiva y de referencia dispara submódulos alternativos", 2016-08-17, Git v2.11.0-rc0 - fusión que figura en el lote # 1 ) enseñó a Git a admitir las opciones de configuración " submodule.alternateLocation
" y " submodule.alternateErrorStrategy
" en un superproyecto .
Si " submodule.alternateLocation
" está configurado para " superproject
" en un superproyecto, cada vez que se clona un submódulo de ese superproyecto, calcula en su lugar la ruta alternativa análoga para ese submódulo desde $GIT_DIR/objects/info/alternates
el superproyecto, y lo referencia.
La submodule.alternateErrorStrategy
opción " " determina qué sucede si no se puede hacer referencia a esa alternativa.
Sin embargo, no está claro que el clon proceda como si no se especificara una alternativa cuando esa opción no está configurada para "morir" (como se puede ver en las pruebas en 31224cbdc7 ).
Por lo tanto, documente en consecuencia.
La documentación del submódulo de configuración ahora incluye:
submodule.alternateErrorStrategy::
Especifica cómo tratar los errores con las alternativas para un submódulo tal como se calcula a través de submodule.alternateLocation
.
Los valores posibles son ignore
, info
, die
.
Por defecto es die
.
Tenga en cuenta que si se establece en ignore
o info
, y si hay un error con la alternativa calculada, el clon continúa como si no se hubiera especificado ninguna alternativa .
git submodule add/update
" ahora puede clonar los repositorios de submódulos superficialmente. Vea mi respuesta a continuación