Convertire il repository git in superficiale?

Come posso convertire un repository git già clonato in un repository poco profondo?

Il repository git viene scaricato tramite uno script al di fuori del mio controllo, quindi non posso fare un clone superficiale.

La ragione per fare questo è di risparmiare spazio sul disco. (Sì, sono davvero a corto di spazio sul disco, quindi anche se un repository poco profondo non risparmia molto, è necessario).

Ho già provato

git repack -a -d -f -depth=1 

Ma questo ha reso il repository più grande.

Diciamo che il primo commit che vuoi mantenere ha uno SHA1 di c0ffee .

  1. Crea un nuovo ramo vuoto
  2. Controlla l’ albero del primo commit che vuoi mantenere, senza effettivamente controllare il commit: git checkout c0ffee -- . (Ora HEAD punta ancora al tuo nuovo ramo vuoto, ma il tuo albero e indice di lavoro assomigliano entrambi all’albero di c0ffee )
  3. Impegna l’intero albero: git commit -m "Initial commit, copied from c0ffee"
  4. A questo punto git diff-tree newbranch c0ffee dovrebbe produrre output – hanno lo stesso albero. (In alternativa, potresti fare git show -s c0ffee --format=%T e git show -s newbranch --format=%T e dovrebbero mostrare lo stesso hash.)
  5. git rebase --onto newbranch c0ffee master
  6. git branch -d newbranch
  7. git gc

Questo ha funzionato per me:

 git pull --depth 1 git gc --prune=all 

Puoi convertire git repo in uno superficiale sul posto seguendo questa linea:

 git show-ref -s HEAD > .git/shallow git reflog expire --expire=0 git prune git prune-packed 

Assicurati di fare il backup poiché si tratta di operazioni distruttive, inoltre tieni presente che la clonazione e il recupero da un repository poco profondo non sono supportati! Per rimuovere davvero tutta la cronologia è necessario rimuovere tutti i riferimenti ai commit precedenti prima di sfoltire.

Soluzione:

 git clone --depth 1 file:///full/path/to/original/dir destination 

Nota che il primo “indirizzo” dovrebbe essere un file:// , questo è importante. Inoltre, git assumerà il tuo file locale originale: // indirizzo come “remoto” (“origine”), quindi dovrai aggiornare il nuovo repository specificando il corretto git remote .