2011-03-16 25 views
72

Come rimuovere i commit che non hanno alcun changeset che utilizza git filter-branch?Git - rimuovi commit con changeset vuoto utilizzando il ramo filtro

ho riscritto la mia storia git utilizzando:

git filter-branch --tree-filter 'rm -r -f my_folder' -f HEAD 

questo ha funzionato bene, ma ora ho un sacco di commit con gruppi di modifiche vuote. Vorrei rimuovere quei commit. Preferibilmente in msysgit.

Il rebasing non è davvero un'opzione perché ho più di 4000 commit e metà di essi devono essere rimossi.

+4

Per i visitatori futuri, '--index-filter' con' git rm -r --ignore-unmatch --cached my_folder' è molto più veloce di '--tree-filter' dato che non deve essere estratto ogni revisione. Funziona interamente sull'indice. – vmrob

+3

E nel caso in cui avete già fatto il lavoro ('--tree-filtro ...') e ora vuole solo sbarazzarsi dei persistenti commit vuote, questo mi ha salvato la pancetta: 'git filter-branch --prune-empty' (solo il 'comando * Filtro-branch' senza alcun * 'filtro') - come si trova in http://stackoverflow.com/questions/28313664/remove-empty-commits-in-git#28313729 - questo è utile quando la risposta di Jefromi qui sotto (http://stackoverflow.com/questions/5324799/git-remove-commits-with-empty-changeset-using-filter-branch#5326065) produce il rapporto di errore 'Trovato nulla da riscrivere' –

risposta

65

Basta aggiungere l'opzione --prune-empty:

git filter-branch --tree-filter 'rm -rf my_folder' --prune-empty -f HEAD 

(E, naturalmente, se si dispone di altri refs, potresti voler riscrivere tutto con -- --all invece di solo HEAD.)

Nota che questo non è compatibile con --commit-filter; in tal caso, Charles Bailey has your answer.

46

Solo in cerca di una documentazione per filter-branch, si dovrebbe essere in grado di fare questo:

git filter-branch --commit-filter 'git_commit_non_empty_tree "[email protected]"' HEAD 
+0

Questo funziona anche se uso la flag -f –

+4

+1 per questo. Molto utile se hai convertito un repository svn, che normalmente genera molti commit vuoti – Fabio

+0

Questo comando non rimuove tutti i commit vuoti nel mio caso ma sfortunatamente non so perché. Qualche altra idea? –