C'è un modo per ridurre le dimensioni della cartella git?


156

Sembra che il mio progetto stia diventando sempre più grande con ogni tipo commit/push. C'è un modo per ripulire la mia cartella git?

Risposte:


214

Non sono sicuro di quello che vuoi. Prima di tutto, ovviamente ogni volta che commetti / spingi la directory diventerà un po 'più grande, dal momento che deve memorizzare ciascuno di quei commit aggiuntivi.

Tuttavia, probabilmente si desidera git gcche "ripulirà i file non necessari e ottimizzerà il repository locale" ( pagina del manuale ).

Un altro comando possibilmente rilevante è git cleanche eliminerà i file non tracciati dalla tua struttura ( pagina del manuale ).


30
git clean -d -f -x elimina i file elencati in .gitignore e simili. Ad esempio aree di lavoro che non appartengono a git, cartella Pods, ecc.
Kalle

102
WARNINGIl comando come scritto sopra da @Kalle rimuoverà OGNI > UNTRACKED <FILE E DIRECTORY ENTRO IL TUO ROOT DI GIT , non solo "file elencati in .gitignore". Tutto ciò che non viene monitorato da Git, indipendentemente dal fatto che sia elencato o meno, .gitignoreverrà cancellato. git clean -dfX(nota il caso sul X) rimuoverà solo gli articoli che hanno una regola applicabile in .gitignore. Per favore segui questo avvertimento: non correre mai git cleansenza eseguirlo in modalità interattiva, con -iinvece di -f, o almeno facendo una corsa a secco prima - -ne poi di nuovo con -f.
Adrian Günter,

5
O fare un backup :-)
Mateen Ulhaq,

61

Correre:

git remote prune origin

Elimina tutti i rami di tracciamento non aggiornati che sono già stati rimossi originma che sono ancora disponibili localmente in remotes/origin.

git gc --auto

' G arbage C ollezione' - piste di pulizia compiti (impacchi revisioni, rimuove perdono / oggetti inaccessibili). La --autobandiera prima determina se è necessario qualche lavoro ed esce senza fare nulla in caso contrario.


4
Qualche spiegazione di quello che fanno? So che possiamo cercarli su Google e cercare la loro documentazione, ma è pratica comune fornire una breve descrizione della tua risposta quando si tratta solo di codice o comandi.
Dzhuneyt,

28

Uno scenario in cui il vostro repo git otterrà seriamente più grande con ogni commit è quella in cui si sta commettendo file binari che si genera con regolarità. La loro memorizzazione non sarà così efficiente come file di testo .

Un altro è quello in cui si ha un numero enorme di file all'interno di un repository (che è un limite di git ) anziché diversi sottorepos ( gestiti come sottomoduli ).

In questo articolo su git space , AlBlue menziona:

Nota che Git (e Hg e altri DVCS) soffrono di un problema in cui i file binari (di grandi dimensioni) vengono archiviati, quindi eliminati, poiché verranno comunque visualizzati nel repository e occuperanno spazio, anche se non sono aggiornati .

Se hai archiviati file binari di grandi dimensioni nel tuo repository git, puoi considerare:

Come ho detto in " Quali sono i limiti dei file in Git (numero e dimensioni)? ", Il più recente (2015, 5 anni dopo questa risposta) Git LFS di GitHub è un modo per gestire quei file di grandi dimensioni (memorizzandoli al di fuori del Git repository).


1
Il supporto per file di grandi dimensioni è utile se si dispone di file binari di grandi dimensioni (come immagini) che vengono regolarmente aggiunti / aggiornati. Vedi git-lfs.github.com . Super facile da implementare, supportato da github. Tutti i membri del team devono installarlo per utilizzarlo in modo collaborativo.
Eric Woods,

@EricWoods True. Ho già parlato di Git-LFS (64 volte: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Ho modificato di conseguenza questa vecchia risposta.
VonC

Ah, davvero! Divertente come una risposta di 9 anni sia ancora pertinente (e ora ancora di più con le informazioni LFS).
Eric Woods,

22

si si, git gcè la soluzione, naturalmente,

e localmente: puoi semplicemente eliminare il repository locale e clonarlo di nuovo,

ma c'è qualcosa di più importante qui ...

i secondi che aspetti che quell'enorme git ed esterni vengano elaborati vengono raccolti in lunghi minuti in cui vengono raccolti in ore di tempo inefficiente trascorso,

Crea un nuovo repository (interamente, non solo un ramo) da zero , inclusa l'unica versione recente dei file, naturalmente perderai tutta la cronologia,

ma quando nel mondo del codice non è il momento di diventare sentimentali, non ha senso trascinare lungo tutti i 5 anni di codice ogni commit o diff, puoi comunque conservare il vecchio git ed esterni da qualche parte, se diventi nostalgico:]

ma a un certo punto devi davvero muoverti:]

la tua squadra ti ringrazierà!


12
Completamente d'accordo, recentemente abbiamo adottato questo approccio con un vecchio repository e non ci siamo guardati indietro; bene, principalmente perché non possiamo, ma sai cosa intendo :)
WhatIsHeDoing

13

L'esecuzione di questo comando è estremamente pericolosa, ma ridurrà il repository cancellando tutti i file di recupero / backup di git:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Cancellerà tutti i file che Git utilizza per ripristinare il repository da un comando errato, ad esempio, se lo hai fatto git reset --hard, di solito puoi recuperare i file persi. Ma se lo fai git reset --hardprima del git reflog expire...comando, allora hai perso tutto. Ora, la tua unica speranza è quella di utilizzare uno strumento che analizzi il tuo file system e provi a recuperare i file cancellati, se non sono stati sovrascritti.


3
Non lo definirei estremamente pericoloso . Vorrei solo etichettarlo qualcosa con cui devi stare attento . Nella mia esperienza, davvero pochissimi toccano mai il reflog o gli oggetti irraggiungibili - la maggior parte non sa nemmeno che sono lì o come interagire con loro, quindi rimangono bloccati in situazioni in cui sarebbero utili o fanno cose terribilmente modo inefficiente. Andrei al punto di dire che se non sai e non riesci a capire cosa faranno questi comandi, puoi tranquillamente eseguirli!
Chris Morgan,

10

git clean -d -f -i è il modo migliore per farlo.

Ciò contribuirà a pulire in modo più controllato.

-i sta per interattivo.


3
Mentre la domanda del PO è vaga, e questa è una buona risposta a questo proposito, voglio sottolineare che git cleannon è per ripulire il repository tanto quanto ripulire la directory. Per gli utenti che copiano / incollano alla cieca, attenzione; questo rimuove i file / le directory non tracciati che potresti effettivamente desiderare localmente.
sraboy,

git clean -d -x -f funziona bene se vuoi pulire in profondità
Rishabh Jain

2

Non so se lo ridurrà, ma dopo l'esecuzione git clean, lo faccio spesso git repack -ad, il che riduce il numero di file pack.


5
repack fa parte del git gcprocesso, quindi non è necessario eseguirlo separatamente
artkoshelev,
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.