¿Es posible tener submódulos poco profundos? Tengo un superproyecto con varios submódulos, cada uno con una larga historia, por lo que se vuelve innecesariamente grande arrastrando toda esa historia.
Todo lo que he encontrado es este hilo sin respuesta .
¿Debería hackear git-submodule para implementar esto?
git
git-submodules
Mauricio Scheffer
fuente
fuente
git submodule add/update
" ahora puede clonar los repositorios de submódulos superficialmente. Vea mi respuesta a continuaciónRespuestas:
Nuevo en el próximo git1.8.4 (julio de 2013) :
(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 :
Eso significa que esto funciona:
Con:
atwyman agrega en los comentarios :
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)MVG señala en los comentarios para cometer fb43e31 (git 2.9, feb 2016)
Actualización de agosto de 2016 (3 años después)
Con Git 2.10 (Q3 2016), podrás hacer
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)Sin embargo, Ciro Santilli agrega en los comentarios (y detalles en su respuesta )
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)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)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.Ver commit 4f3e57e , commit 10c64a0 (02 dic 2019) por Jonathan Tan (
jhowtan
) .(Fusionada por Junio C Hamano -
gitster
- en commit 5dd1d59 , 10 dic 2019)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.
La documentación del submódulo de configuración ahora incluye:
fuente
--depth
debería tomar una discusión también;)uploadpack.allowReachableSHA1InWant
yuploadpack.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..gitmodules
, ¿funciona la--depth 1
opción para sucursales que no están siguiendo de cerca al maestro?Git 2.9.0 admite submódulos clon superficial directamente, por lo que ahora solo puede llamar:
fuente
Siguiendo la respuesta de Ryan, pude crear este simple script que itera a través de todos los submódulos y los clona superficialmente:
fuente
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
para cada submóduloAl leer la "fuente" de git-submodule, parece que
git submodule add
puede manejar submódulos que ya tienen sus repositorios presentes. En ese caso...Deberá asegurarse de que la confirmación requerida esté en el repositorio de submódulos, así que asegúrese de establecer una profundidad adecuada.
Editar: es posible que pueda escapar con múltiples clones de submódulos manuales seguidos de una sola actualización:
fuente
Resumen de comportamiento con errores / inesperado / molesto a partir de Git 2.14.1
shallow = true
en.gitmodules
sólo afectagit clone --recurse-submodules
si elHEAD
de los puntos submódulo remotas a la necesaria confirmación, incluso si el objetivo cometer es apuntado por una rama, e incluso si se ponebranch = mybranch
en el.gitmodules
también.Guión de prueba local . Mismo comportamiento en GitHub 2017-11, donde
HEAD
está controlado por la configuración predeterminada de repositorio de sucursal:git clone --recurse-submodules --shallow-submodules
falla si la confirmación se hace referencia ni por una rama o una etiqueta con un mensaje:error: Server does not allow request for unadvertised object
.Guión de prueba local . Mismo comportamiento en GitHub:
También pregunté en la lista de correo: https://marc.info/?l=git&m=151863590026582&w=2 y la respuesta fue:
Prueba de TODO:
allowReachableSHA1InWant
.fuente
git clone --recursive
que solo obtienen esa confirmación específica.¿Las ubicaciones canónicas para sus submódulos son remotas? Si es así, ¿estás de acuerdo con clonarlos una vez? En otras palabras, ¿desea los clones poco profundos solo porque sufre el ancho de banda desperdiciado de los (re) clones de submódulos frecuentes?
Si desea clones poco profundos para ahorrar espacio en disco local, la respuesta de Ryan Graham parece ser un buen camino a seguir. Clonar manualmente los repositorios para que sean poco profundos. Si cree que sería útil, adáptese
git submodule
para soportarlo. Envíe un correo electrónico a la lista preguntándole (consejos para implementarlo, sugerencias sobre la interfaz, etc.). En mi opinión, la gente de allí apoya bastante a los posibles contribuyentes que desean mejorar Git de manera constructiva.Si está de acuerdo con hacer un clon completo de cada submódulo (más las recuperaciones posteriores para mantenerlas actualizadas), puede intentar usar la
--reference
opción degit submodule update
(está en Git 1.6.4 y posterior) para referirse a los almacenes de objetos locales (p. Ej. haga--mirror
clones de los repositorios de submódulos canónicos, luego úselos--reference
en sus submódulos para apuntar a estos clones locales). Solo asegúrese de leer sobregit clone --reference
/git clone --shared
antes de usar--reference
. El único problema probable con los espejos de referencia sería si alguna vez terminan obteniendo actualizaciones que no son de avance rápido (aunque podría habilitar los registros y expandir sus ventanas de vencimiento para ayudar a retener cualquier confirmación abandonada que pueda causar un problema). No deberías tener ningún problema mientrasSi opta por algo como esto y existe la posibilidad de que pueda llevar a cabo confirmaciones de submódulos locales en sus árboles de trabajo, probablemente sea una buena idea crear un sistema automatizado que se asegure de que los objetos críticos a los que hacen referencia los submódulos desprotegidos no sean colgado en los repositorios espejo (y si encuentra alguno, cópielos en los repositorios que los necesiten).
Y, como
git clone
dice la página de manual, no lo use--reference
si no comprende estas implicaciones.Alternativamente, en lugar de
--reference
, podría usar los clones espejo en combinación con la funcionalidad predeterminada de enlace directo degit clone
usar espejos locales como la fuente de sus submódulos. En nuevos clones de superproyectos, hagagit submodule init
, edite las URL de submódulo.git/config
para apuntar a los espejos locales, luego hagagit submodule update
. Tendría que reclinar cualquier submódulo desprotegido existente para obtener los enlaces duros. Ahorraría ancho de banda al descargar solo una vez en los espejos y luego buscarlos localmente en los submódulos desprotegidos. El enlace duro ahorraría espacio en el disco (aunque las recuperaciones tenderían a acumularse y duplicarse en múltiples instancias de los almacenes de objetos de los submódulos desprotegidos; periódicamente podría reclinar los submódulos desprotegidos de los espejos para recuperar el ahorro de espacio en disco proporcionado por hardlinking).fuente
Creé una versión ligeramente diferente, para cuando no se está ejecutando a la última, lo que no hacen todos los proyectos. Las adiciones estándar de submódulos no funcionaron ni el script anterior. Así que agregué una búsqueda hash para la etiqueta de referencia, y si no tiene una, vuelve a clonar por completo.
fuente
Referencia a ¿Cómo clonar el repositorio git con una revisión / conjunto de cambios específico?
He escrito un script simple que no tiene ningún problema cuando su referencia de submódulo está lejos del maestro
Esta declaración buscará la versión referenciada del submódulo.
Es rápido, pero no puede confirmar su edición en el submódulo (debe recuperarlo antes de https://stackoverflow.com/a/17937889/3156509 )
en su totalidad:
fuente
El clon superficial de un submódulo es perfecto porque se capturan en una revisión / conjunto de cambios en particular. Es fácil descargar un archivo zip del sitio web, así que probé un script.
git submodule deinit --all -f
borra el árbol de submódulos que permite que el script sea reutilizable.git submodule
recupera el 40 char sha1 seguido de una ruta que corresponde a la misma en.gitmodules
. Utilizo perl para concatenar esta información, delimitada por dos puntos, luego empleo la transformación de variables para separar los valores enmysha
ymysub
.Estas son las claves críticas porque necesitamos el sha1 para descargar y la ruta para correlacionar los
url
ingitmodules.Dada una entrada típica de submódulo:
myurl
teclas enpath =
luego mira 2 líneas después para obtener el valor. Es posible que este método no funcione de manera consistente y requiera refinamiento. La url grep elimina cualquier.git
referencia de tipo restante haciendo coincidir la última/
y cualquier cosa hasta a.
.mydir
esmysub
menos un final/name
que sería por el directorio que conduce al nombre del submódulo.El siguiente es un
wget
formato de URL de archivo zip descargable. Esto puede cambiar en el futuro.Descomprima el archivo en el
mydir
que sería el subdirectorio especificado en la ruta del submódulo. La carpeta resultante será el último elemento deurl
-sha1
.Verifique si el subdirectorio especificado en la ruta del submódulo existe y elimínelo para permitir el cambio de nombre de la carpeta extraída.
mv
cambie el nombre de la carpeta extraída que contiene nuestro sha1 a su ruta de submódulo correcta.Eliminar el archivo zip descargado.
Submódulo init
Esto es más una prueba de concepto WIP en lugar de una solución. Cuando funciona, el resultado es un clon superficial de un submódulo en un conjunto de cambios especificado.
Si el repositorio vuelve a colocar un submódulo en una confirmación diferente, vuelva a ejecutar el script para actualizar.
La única vez que un script como este sería útil es para la construcción local no colaborativa de un proyecto fuente.
fuente