2013-04-22 15 views
5

Sto riscrivendo la cronologia di un repository abbastanza grande usando git filter-branch --tree-filter e ci vogliono alcune ore. Vedo che git sta usando una directory temporanea per archiviare il suo lavoro intermedio mentre procede. Significa che è possibile riprendere una riscrittura se viene interrotta? Se é cosi, come?Come posso riprendere una riscrittura della cronologia git?

Modifica

L'operazione che sto facendo si sta muovendo un paio di directory. Questi sono attualmente nelle sottodirectory, ma ora ho bisogno che siano nella radice.

ad es.

dir1 
- dir2 
- dir3 
- dir4 

diventa

dir1 
- dir2 
dir3 
dir4 

Naturalmente la mia struttura di directory è molto più complesso di quello, ma questa è l'essenza di quello che sto cercando di fare.

+0

Per curiosità (non proprio essenziale per la tua domanda), puoi descrivere con quale operazione stai facendo - filtro dell'albero? Rimozione o modifica dei file? –

risposta

13

git filter-branch per sé non supportano un suspend/resume modello di consumo - anche se scrive i dati temporanei fuori in una cartella .git-rewrite, non c'è alcun supporto reale per la ripresa in base al contenuto di questa directory. Se esegui git filter-branch su un repository che ha subito un'operazione interrotta filter-branch, ti chiederà di eliminare quella cartella temporanea o, con l'opzione --force, do it itself.

Il problema di fondo è che git-filter-branch è lento su grandi repository - se il processo è molto più veloce, non ci sarebbe alcuna motivazione per tentare un curriculum. Così avete alcune opzioni:

make git-filtro-ramo andare un po 'più veloce ...

  • utilizzare un RAM-disk - git-filter-branch è molto IO-intensive, e funzionerà più velocemente con il vostro repository seduto nella RAM.
  • uso --index-filter piuttosto che --tree-filter - è simile al filtro di albero, ma non controlla il file-albero, che lo rende più veloce, ma fa richiedono di riscrivere il file di alterazioni in termini di comandi indice git.
  • uso cloud computing e noleggiare una macchina con ram veloce e di alta velocità di clock (non perdete tempo con più core a meno che i vostri comandi sono multi-threaded, come git-filter-branch sé è single-threaded)

.. .o usare The BFG (modo più veloce)

Il BFG Repo-Cleaner è un più semplice, più veloce alternativa al git-filter-branch - su grandi pronti contro termine è 50-150x più veloce. Questo trasforma il tuo lavoro in diverse ore in uno che richiede solo pochi minuti.

Divulgazione completa: sono l'autore di BFG Repo-Cleaner.

+0

Grazie per i puntatori. L'esecuzione in una macchina virtuale Linux con un disco RAM ha notevolmente accelerato le cose. Non ero in grado di utilizzare BFG Repo-Cleaner poiché l'operazione che sto facendo si sta spostando un paio di directory in modo che siano nella directory radice piuttosto che in una sottodirectory.Per quanto posso dire questo rende '--index-filter' anche ingannevole dato che' git mv' non funziona solo sull'indice – alnorth29

+0

Very lieto di aver accelerato le cose. Tra l'altro, spostare/cancellare le directory è una caratteristica che sto cercando di aggiungere al BFG - aggiungerò un commento quando sarà completo. ng l'esempio di utilizzo! –

+0

@ alnorth29 scuse, un'ulteriore domanda: qual era la giustificazione per la mossa della sottodirectory? Perché era necessario? –

6

Roberto menzionato questo nella sua risposta, ma voglio dare un punto di riferimento per questo: se l'operazione git filter-branch sta prendendo a lungo per completare, si consideri un esempio di memoria alta AWS.

Una volta ho dovuto filter-branch e unire insieme 35 diversi repository, ciascuno con due anni di dozzine di commetti al giorno. Il mio script non è stato completato in 25 ore sul mio portatile. È stato completato in 45 minuti su un'istanza m2.4xlarge in Amazon.

Costo totale?

$ 1,64 - meno di quanto spendo in una soda da 20 once.

BFG sembra un ottimo strumento e incoraggerei chiunque riscriva abitualmente la cronologia per provarlo. Ma se hai solo bisogno di qualcosa per funzionare e avere un facile accesso ad AWS, filter-branch è banalmente facile.

Nel 2016 questo è ancora più economico. Basta andare al Spot Advisor e trovare qualcosa del "cluster compute per $ 0.30/ora varietà