¿Hay alguna manera de recuperar solo una confirmación específica de un repositorio de Git remoto sin clonarlo en mi PC? La estructura del repositorio remoto es absolutamente la misma que la mía y, por lo tanto, no habrá conflictos, pero no tengo idea de cómo hacer esto y no quiero clonar ese enorme repositorio.
Soy nuevo en git, ¿hay alguna manera?
Respuestas:
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)
Si combina esa configuración del lado del servidor con un clon superficial (
git fetch --depth=1
), puede solicitar una sola confirmación (consultet/t5516-fetch-push.sh
:Puede usar el
git cat-file
comando para ver que se ha obtenido la confirmación:La documentación completa es:
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)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)De ahí la nueva documentación :
R .. menciona en los comentarios la configuración
uploadpack.allowAnySHA1InWant
, que permiteupload-pack
aceptar unafetch
solicitud que solicita cualquier objeto. (El valor predeterminado esfalse
).Ver commit f8edeaa (noviembre de 2016, Git v2.11.1) por David "novalis" Turner (
novalis
) :fuente
uploadpack.allowAnySHA1InWant
penalización de cálculo de accesibilidad (y el vector DoS).Solo clonas una vez, por lo que si ya tienes un clon del repositorio remoto, extraerlo no descargará todo nuevamente. Simplemente indique qué rama desea obtener o busque los cambios y verifique la confirmación que desea.
Obtener datos de un nuevo repositorio es muy barato en ancho de banda, ya que solo descargará los cambios que no tenga. Piense en términos de Git haciendo lo correcto, con una carga mínima.
Git almacena todo en la
.git
carpeta. Una confirmación no se puede recuperar y almacenar de forma aislada, necesita todos sus antepasados. Están relacionados entre sí .Sin embargo, para reducir el tamaño de descarga, puede pedirle a git que busque solo objetos relacionados con una rama o confirmación específica:
Esto descargará solo las confirmaciones contenidas en la rama remota
branch
(y solo las que se pierden) y las almacenaráorigin/branch
. Luego puede fusionar o finalizar la compra.También puede especificar solo una confirmación SHA1:
Esto descargará solo el commit del SHA-1 96de5297df870 especificado (y sus antepasados que echa de menos), y lo almacenará como una rama remota (no existente)
origin/foo-commit
.fuente
2.7.4-0ubuntu1.3
. Sin embargo, cuando se usa2.16.2-0ppa1~ubuntu16.04.1
desde el PPA git-core, esto funciona como debería. Suena como un error que se solucionó. No se pudo encontrar una referencia a eso con una búsqueda rápida. Si alguien me puede dar una pista sobre eso, me encantaría que esta solución sea compatible.Hice un tirón en mi repositorio de git:
Permití a git extraer todo el código de la rama y luego fui a restablecer el commit que me interesaba.
git reset --hard <commit-hash>
Espero que esto ayude.
fuente
git reset --hard
, cuando se comparten en soluciones generalizadas, pueden llevar a las personas a trampas donde pierden datos (o, en este caso: en un estado donde recuperar sus datos no es trivial).Simplemente puede obtener una confirmación única de un repositorio remoto con
dónde,
<repo>
puede ser un nombre de repositorio remoto (por ejemploorigin
) o incluso una URL de repositorio remoto (por ejemplohttps://git.foo.com/myrepo.git
)<commit>
puede ser el commit SHA1por ejemplo
después de recuperar el commit (y los antepasados que faltan), simplemente puede verificarlo con
Tenga en cuenta que esto lo llevará al estado de "cabeza separada".
fuente
fetch
una revolución específica como la que haces allí, git falla con el código de error 1 y sin salida. ¿Era esto algo que solía funcionar en versiones anteriores? (Soy v2.0.2.)fetch
, aunque en ese caso no estoy seguro de qué uso.git checkout FETCH_HEAD
ayuda--depth=1
)!Simplemente puede obtener el repositorio remoto con:
dónde,
<repo>
puede ser un nombre de repositorio remoto (por ejemploorigin
) o incluso una URL de repositorio remoto (por ejemplohttps://git.foo.com/myrepo.git
)por ejemplo:
después de buscar los repositorios, puede fusionar los commits que desee (ya que la pregunta es sobre recuperar un commit, en su lugar, puede usar cherry-pick para elegir solo un commit):
<commit>
puede ser el commit SHA1por ejemplo:
o
Si es la última confirmación que desea fusionar, también puede usar la variable FETCH_HEAD:
fuente
git config set uploadpack.allowReachableSHA1InWant
?Esto funciona mejor:
nombre "temp" lo que quieras ... aunque esta rama podría quedar huérfana
fuente
Finalmente encontré una manera de clonar commit específico usando git cherry-pick . Suponiendo que no tiene ningún repositorio en local y está extrayendo una confirmación específica de forma remota,
1) crear repositorio vacío en local y git init
2) git remote add origin " url-of-repository "
3) git fetch origin [esto no moverá sus archivos a su espacio de trabajo local a menos que se fusione]
4) git cherry-pick " Enter-long-commit-hash-that-you-you " necesita
Hecho. De esta manera, solo tendrá los archivos de esa confirmación específica en su local.
Enter-long-commit-hash:
Puede obtener esto usando -> git log --pretty = oneline
fuente
Creo que 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) debería hacer lo que quieras. Sin fuerza, traiga o tire.
fuente
Si la confirmación solicitada está en las solicitudes de extracción del repositorio remoto, puede obtenerla por su ID:
fuente