¿Cómo convertir un clon superficial de Git en un clon completo?


Respuestas:


93

EDITAR: git fetch --unshallow ahora es una opción (gracias Jack O'Connor).

Puede ejecutar git fetch --depth=1000000(suponiendo que el repositorio tenga menos de un millón de confirmaciones).


238
Ahora que git fetch --unshallowexiste (como en la respuesta de @ sdram), esta respuesta ya no es la mejor.
Jack O'Connor

1
La respuesta de @ sdram no funcionó para mí (git versión 2.1.1), pero esta respuesta sí.
kay - SE es malvado

2
Ninguna de las respuestas funcionó para mí. Ambos comandos lograron recuperar todos los commits faltantes, pero cuando trato de empujar nuevos commits, recibo un error acerca de que el servidor no sabe acerca de las referencias 'superficiales'
Tyguy7

3
git fetch --depth=2147483647es la mayor profundidad posible para proporcionar al comando.
clacke

55
Solía git fetch --unshallow, pero todavía no muestra todas las ramas.
Sid

674

El siguiente comando (git versión 1.8.3) convertirá el clon superficial a uno normal

git fetch --unshallow

Luego, para acceder a todas las ramas en origen (gracias @Peter en los comentarios)

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

36
Esto no deshace el efecto secundario de una sola rama. Para hacer eso, edite .git / config y cambie fetch = + refs / heads / BRANCHNAME: refs / remotes / origin / BRANCHNAME to fetch = + refs / heads / *: refs / remotes / origin / *
Peter Cordes

3
Esto no crea sucursales locales que rastrean las sucursales remotas, por lo que aún debe pagar -b BRNAME origin / BRNAME para configurarlo.
Peter Cordes

26
Ver también stackoverflow.com/questions/17714159/… : a git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"; git fetch origin partir de una respuesta, debería ser lo mismo que editar a mano .git / config
Peter Cordes

Esto solo funciona si el repositorio está marcado como poco profundo. No recuerdo cómo, pero hay situaciones en las que puedes terminar con un repositorio incompleto sin haber hecho explícitamente un clon superficial. @ svick's stackoverflow.com/a/6802238/260122 es la respuesta que siempre funciona.
clacke

git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'funcionó para mí
gzaripov

19

Necesitaba profundizar un repositorio solo a un compromiso particular.

Después de leer man git-fetch, descubrí que uno no puede especificar una confirmación, pero puede especificar una fecha:

git fetch --shallow-since=15/11/2012

Para aquellos que necesitan una profundización incremental, otra mancita:

--deepen=<depth>

Similar a --depth, excepto que especifica el número de confirmaciones desde el límite superficial actual en lugar de desde la punta de cada historial de rama remota.



0

Ninguno de los mensajes anteriores hizo el truco. Estoy tratando de trabajar con etiquetas git a partir de un clon superficial.

Primero probé

git fetch --update-shallow

que tipo de trabajo a mitad de camino. ¡Sin embargo, no hay etiquetas disponibles!

git fetch --depth=1000000

Este último comando realmente obtuvo las etiquetas y finalmente pude ejecutar

git checkout -b master-v1.1.0 tags/v1.1.0

y terminemos con eso.

HTH


0

Dos formas de lograr Shallow Clone a Deep Clone. :

  1. Usó los siguientes pasos para descargar la rama: (Esto descarga la copia superficial de la rama y luego la convierte en un Clon completo, es decir, trae la rama completa y su historial).

    a. git clone -b branch http: //git.repository/customSP01.git --depth 1

Esto hace que un clon superficial (con la opción de profundidad) solo obtenga una sola rama (a la profundidad solicitada).

b. cd customSP01
c. git fetch –depth=100
d. get fetch –depth=500
....
e. git fetch –unshallow    

// El comando anterior convertirá el clon superficial en uno normal. Sin embargo, esto no trae todas las ramas:

Luego, para acceder a todas las sucursales.

f. git remote set-branches origin '*'

[Este paso también se puede hacer manualmente editando la siguiente línea en .git / config.

fetch = + refs / heads / master: refs / remotes / origin / master

para (reemplazar maestro con *):

fetch = + refs / heads / *: refs / remotes / origin / *]

g. git fetch -v

Esto convierte el clon superficial en clon profundo con todos los detalles del historial y la rama.


  1. Puede evitar los pasos fyg, si usa el siguiente en lugar del comando presente en el paso a. para hacer el clon superficial:

    git clone -b branch --no-single-branch http: //git.repository/customSP01.git --depth 1

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.