Un modo semplice (ma lento) per farlo è con git filter-branch
e --prune-empty
. Senza altri filtri, non verranno alterati altri commit, ma tutti quelli vuoti verranno scartati (il che farà sì che tutti i commit successivi abbiano nuovi ID parent e quindi sia ancora "riscritta la cronologia": non un grosso problema se questa è la tua iniziale importa da hg a git, ma è un grosso problema se gli altri usano già questo repository).
Nota tutti i soliti avvertimenti con filtro-ramo. (Inoltre, come nota a margine, un "commit vuoto" è in realtà uno che ha lo stesso albero del commit precedente: non è che non ha alcun file, è che ha tutti gli stessi file, con le stesse modalità, e gli stessi contenuti, come il suo genitore commesso. Questo perché Git istantanee complete per ogni impegnano, senza differenze da un impegnano a quella successiva.)
Ecco un piccolo esempio che nasconde un sacco di posti che può fare cose più elaborate:
$ ... create repository ...
$ cd some-tmp-dir; git clone --mirror file://path-to-original
(Questo primo passo clone è per la sicurezza: filter-branch
può essere molto distruttivo quindi è sempre bene iniziare su un nuovo clone r più dell'originale. Utilizzando --mirror
significa tutti i suoi rami e tag sono rispecchiata in questa copia, troppo)
$ git filter-branch --prune-empty --tag-name-filter cat -- --all
(Ora aspetta un potenzialmente molto lungo;. Consultare la documentazione sui metodi per accelerare l'operazione un po ')
$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
.
(Questo passaggio viene copiato dalla documentazione: elimina tutti i rami originali da prima dell'esecuzione del filtro. In altre parole, rende permanente il filtro. Poiché si tratta di un clone, è ragionevolmente sicuro farlo anche se il filtro è andato sbagliato.)
$ cd third-tmp-dir; git clone --mirror file://path-to-filtered-tmp
(Questo lo rende un ambiente pulito copia, ben-compressa del copia filtrata, senza oggetti rimasto dalle le fasi di filtraggio.)
$ git log # and other commands to inspect
Una volta che siete sicuri il clone del clone filtrato è buona, non serve il clone filtrato e può usare l'ultimo clone al posto del primo. (Cioè, è possibile sostituire la "vera originale" con il clone finale.)
Puoi mostrarmi un esempio su come usarlo?Mi scuso per la richiesta, ma sono nuovo per git – Greeso
Thaks, mi hai salvato. Ci lavoreremo ora. – Greeso