Come convertire un clone Git shallow in un clone completo?


Risposte:


93

EDIT: git fetch --unshallow ora è un'opzione (grazie Jack O'Connor).

Puoi correre git fetch --depth=1000000 (presupponendo che il repository abbia meno di un milione di commit).


238
Ora che git fetch --unshallowesiste (come nella risposta di @ sdram), questa risposta non è più la migliore.
Jack O'Connor,

1
La risposta di @ sdram non ha funzionato per me (versione git 2.1.1), ma questa risposta ha funzionato.
kay - SE è malvagio il

2
Nessuna risposta ha funzionato per me. Entrambi i comandi sono riusciti a recuperare tutti i commit mancanti, ma quando provo a inviare nuovi commit, ricevo un errore sul server che non è a conoscenza di ref 'superficiali'
Tyguy7,

3
git fetch --depth=2147483647è la massima profondità possibile da fornire al comando.
clacke,

5
Ho usato git fetch --unshallow, ma non mostra ancora tutti i rami.
Sid,

674

Il comando seguente (versione 1.8.3 di git) convertirà il clone shallow in uno normale

git fetch --unshallow

Quindi, per ottenere l'accesso a tutte le filiali su origine (grazie @Peter nei commenti)

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

36
Questo non annulla l'effetto collaterale --single-branch. Per fare ciò, modifica .git / config e cambia fetch = + refs / heads / BRANCHNAME: refs / telecomandi / origin / BRANCHNAME da recuperare = + refs / heads / *: refs / telecomandi / origin / *
Peter Cordes

3
Questo non crea filiali locali che tracciano le filiali remote, quindi devi comunque effettuare il checkout -b BRNAME origin / BRNAME per ottenere quella configurazione.
Peter Cordes,

26
Vedi anche stackoverflow.com/questions/17714159/… : git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"; git fetch origin da una risposta dovrebbe esserci la stessa modifica di .git / config a mano
Peter Cordes,

Funziona solo se il repository è contrassegnato come superficiale. Non ricordo come, ma ci sono situazioni in cui si può finire con un repository incompleto senza aver fatto esplicitamente un clone superficiale. @ di svick stackoverflow.com/a/6802238/260122 è la risposta che funziona ogni volta.
clacke,

git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'ha funzionato per me
gzaripov

19

Avevo bisogno di approfondire un repository solo fino a un determinato commit.

Dopo aver letto man git-fetch, ho scoperto che non è possibile specificare un commit, ma è possibile specificare una data:

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

Per coloro che hanno bisogno di un approfondimento incrementale, un'altra mancitazione:

--deepen=<depth>

Simile a --depth, tranne per il fatto che specifica il numero di commit dal limite superficiale corrente anziché dalla punta della cronologia di ciascun ramo remoto.



0

Nessuno dei messaggi sopra ha fatto il trucco. Sto cercando di lavorare con i tag git a partire da un clone superficiale.

Prima ho provato

git fetch --update-shallow

che tipo di lavoro ha funzionato a metà strada. Tuttavia, nessun tag disponibile!

git fetch --depth=1000000

Quest'ultimo comando ha davvero recuperato i tag e ho potuto finalmente eseguire

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

ed essere fatto con esso.

HTH


0

Due modi per ottenere il clone superficiale al clone profondo. :

  1. Utilizzato i seguenti passi per scaricare il ramo: (Questo scarica la copia superficiale del ramo e poi lo converte in un clone completo, cioè porta il ramo completo e la sua storia).

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

Questo fa un clone superficiale (con l'opzione di profondità) recupera solo un singolo ramo (alla profondità richiesta).

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

// Il comando sopra convertirà il clone superficiale in uno normale. Tuttavia, questo non porta tutti i rami:

Quindi, per ottenere l'accesso a tutte le filiali.

f. git remote set-branches origin '*'

[Questo passaggio può essere eseguito anche manualmente modificando la riga seguente in .git / config.

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

a (sostituisci master con *):

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

g. git fetch -v

Questo converte il clone superficiale in clone profondo con tutti i dettagli di storia e ramo.


  1. È possibile evitare i passaggi feg, se si utilizza il comando seguente invece del comando presente nel passaggio a. fare il clone superficiale:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.