2011-03-16 11 views
72

¿Cómo elimino commits que no tienen ningún conjunto de cambios usando git filter-branch?Git - eliminar commits con conjunto de cambios vacío usando filter-branch

me volvió a escribir la historia de mi git usando:

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

Esto funcionó bien, pero ahora tengo un montón de confirmaciones con conjuntos de cambios vacías. Me gustaría eliminar esos commits. Preferiblemente en msysgit.

Rebasar no es realmente una opción porque tengo más de 4000 confirmaciones y la mitad de ellas deben eliminarse.

+4

Para futuros visitantes, '--index-filter' con' git rm -r --ignore-unmatch --cached my_folder' es mucho más rápido que '--tree-filter' ya que no tiene que ver cada revisión. Opera completamente en el índice. – vmrob

+3

Y en caso de que ya hayas hecho el trabajo ('--tree-filter ...') y ahora solo quieras deshacerte de las confirmaciones vacías persistentes, esto salvó mi tocino: 'git filter-branch --prune-empty' (solo el comando 'filter-branch' * sin * ningún 'filtro') - como se encuentra en http://stackoverflow.com/questions/28313664/remove-empty-commits-in-git#28313729 - esto es útil cuando la respuesta de Jefromi a continuación (http://stackoverflow.com/questions/5324799/git-remove-commits-with-empty-changeset-using-filter-branch#5326065) produce el informe de error 'Found nothing to rewrite' –

Respuesta

65

Sólo tiene que añadir la opción --prune-empty:

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

(Y, por supuesto, si tiene otra refs, es posible que desee volver a escribir todo con -- --all en lugar de solo HEAD.)

Tenga en cuenta que esto no es así. no es compatible con --commit-filter; en ese caso, Charles Bailey has your answer.

46

Con sólo mirar una la documentación para filter-branch, usted debería ser capaz de hacer esto:

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

Esto funciona también si uso el indicador -f –

+4

+1 para esto. Muy útil si ha convertido un repositorio svn, que normalmente genera muchas confirmaciones vacías – Fabio

+0

Este comando no elimina todas las confirmaciones vacías en mi caso, pero desafortunadamente no sé por qué. ¿Alguna otra idea? –

Cuestiones relacionadas