A partir de Git versión 2.5+ (Q2 2015), es posible obtener una sola confirmación (sin clonar el repositorio completo).
Ver commit 68ee628 por Fredrik Medley ( moroten
) , 21 de mayo de 2015.
(Fusionada por Junio C Hamano - gitster
- en commit a9d3493 , 01 jun 2015)
Ahora tiene una nueva configuración (en el lado del servidor)
uploadpack.allowReachableSHA1InWant
Permita upload-pack
aceptar una solicitud de búsqueda que solicite un objeto al que se pueda acceder desde cualquier sugerencia de referencia. Sin embargo, tenga en cuenta que calcular el alcance de los objetos es computacionalmente costoso.
Por defecto es false
.
Si combina esa configuración del lado del servidor con un clon superficial ( git fetch --depth=1
), puede solicitar una sola confirmación (consulte t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Puede usar el git cat-file
comando para ver que se ha obtenido la confirmación:
git cat-file commit $SHA1
Se le puede decir a " git upload-pack
" que sirve " git fetch
" que sirva confirmaciones que no están en la punta de ninguna referencia, siempre que sean accesibles desde una referencia, con una uploadpack.allowReachableSHA1InWant
configuración variable.
La documentación completa es:
upload-pack
: opcionalmente permite buscar sha1 accesible
Con la uploadpack.allowReachableSHA1InWant
opción de configuración establecida en el lado del servidor, " git fetch
" puede realizar una solicitud con una línea "querer" que nombra un objeto que no se ha anunciado (probablemente se haya obtenido fuera de banda o desde un puntero de submódulo).
Solo transfer.hideRefs
se procesarán los objetos accesibles desde las puntas de las ramas, es decir, la unión de las ramas anunciadas y las ramas ocultas por .
Tenga en cuenta que hay un costo asociado de tener que retroceder en el historial para verificar la accesibilidad.
Esta característica se puede usar cuando se obtiene el contenido de un determinado commit, para el cual se conoce sha1, sin la necesidad de clonar todo el repositorio, especialmente si se usa una búsqueda superficial .
Los casos útiles son, por ejemplo,
- repositorios que contienen archivos grandes en el historial,
- obtener solo los datos necesarios para un pago de submódulo,
- cuando comparte un sha1 sin decir a qué rama exacta pertenece y en Gerrit, si piensa en términos de commits en lugar de números de cambio.
(El caso de Gerrit ya se ha resuelto allowTipSHA1InWant
ya que cada cambio de Gerrit tiene una referencia).
Git 2.6 (Q3 2015) mejorará ese modelo.
Ver commit 2bc31d1 , commit cc118a6 (28 de julio de 2015) por Jeff King ( peff
) .
(Fusionada por Junio C Hamano - gitster
- en commit 824a0be , 19 de agosto de 2015)
refs
: soporte negativo transfer.hideRefs
Si oculta una jerarquía de referencias usando la transfer.hideRefs
configuración, no hay forma de anular esa configuración para "mostrarla".
Este parche implementa un ocultamiento "negativo" que hace que las coincidencias se marquen inmediatamente como ocultas, incluso si otra coincidencia lo oculta.
Nos encargamos de aplicar las coincidencias en orden inverso a la forma en que nos las alimenta la maquinaria de configuración, ya que eso permite que nuestro trabajo habitual de precedencia de configuración "el último gana" (y las entradas .git/config
, por ejemplo, se anularán /etc/gitconfig
).
Entonces ahora puedes hacer:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
para esconderse refs/secret
en todos los repositorios, excepto un bit público en un repositorio específico.
Git 2.7 (nov / dic 2015) mejorará nuevamente:
Consulte commit 948bfa2 , commit 00b293e (05 de noviembre de 2015), commit 78a766a , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 de noviembre de 2015), commit 00b293e , commit 00b293e (05 de noviembre de 2015) y commit 92cab49 , commit 92cab49 , commit 92cab49 , cometer 92cab49 (03 de noviembre de 2015) por Lukas Fleischer ( lfos
) .
Ayudado por: Eric Sunshine ( sunshineco
) .
(Fusionada por Jeff King - peff
- en commit dbba85e , 20 de noviembre de 2015)
config.txt
: documentar la semántica de hideRefs
con espacios de nombres
En este momento, no hay una definición clara de cómo transfer.hideRefs
debería comportarse cuando se establece un espacio de nombres.
Explique que los hideRefs
prefijos coinciden con nombres despojados en ese caso. Así es como hideRefs
se manejan actualmente los patrones en el paquete de recepción.
hideRefs: agrega soporte para emparejar referencias completas
Además de hacer coincidir las referencias despojadas, ahora se pueden agregar hideRefs
patrones con los que se compara la referencia completa (sin tirar).
Para distinguir entre coincidencias despojadas y completas, esos nuevos patrones deben tener el prefijo circunflejo ( ^
).
De ahí la nueva documentación :
transfer.hideRefs:
Si se utiliza un espacio de nombres, el prefijo del espacio de nombres se elimina de cada referencia antes de que coincida con los transfer.hiderefs
patrones.
Por ejemplo, si refs/heads/master
se especifica en transfer.hideRefs
y el espacio de nombres corriente foo
, entonces refs/namespaces/foo/refs/heads/master
se omite de los anuncios, pero refs/heads/master
y
refs/namespaces/bar/refs/heads/master
todavía se anuncian como las denominadas líneas de "tener".
Para hacer coincidir las referencias antes de eliminar, agregue un ^
delante del nombre de referencia. Si combina !
y ^
, !
debe especificarse primero.
R .. menciona en los comentarios la configuración uploadpack.allowAnySHA1InWant
, que permite upload-pack
aceptar una fetch
solicitud que solicita cualquier objeto. (El valor predeterminado es false
).
Ver commit f8edeaa (noviembre de 2016, Git v2.11.1) por David "novalis" Turner ( novalis
) :
upload-pack
: opcionalmente permite buscar cualquier sha1
Parece un poco tonto hacer una comprobación de accesibilidad en el caso en el que confiamos en que el usuario tenga acceso a absolutamente todo en el repositorio.
Además, es picante en un sistema distribuido: tal vez un servidor anuncia una referencia, pero otro ha tenido un empuje forzado a esa referencia, y tal vez las dos solicitudes HTTP terminan dirigidas a estos servidores diferentes.