¿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).

svick
fuente
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
Ramkumar D
fuente
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.

Victor Sergienko
fuente
1

Puedes probar esto:

git fetch --update-shallow
Altynai
fuente
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

Gen.Stack
fuente
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

Rajeev Ranjan
fuente