Agregar ignorar files a git repo retroactivamente

Entonces tuve este proyecto donde al principio hice un

git add . 

para poder trabajar y no molestarme con qué files iban a controlarse las versiones o qué.

Eso, por supuesto, se volvió doloroso, ya que mientras entre cada commit usualmente solo cambio 3-5 files, todos los files de construcción (.class, .html, .xml, etc.) están completamente regenerados, lo que significa que al hacer un

 git add . 

agregará cientos de files en lugar de los 3-5 files que realmente cambié.

Sé que puedo agregar todos los files no deseados a un file .gitignore . Lo que me gustaría hacer es si hay una manera de hacer esto retroactivamente. Me gustaría deshacerme de todos los files que no deberían haber estado en commits en primer lugar.

¿Es posible hacer esto en git? Si es así, ¿cómo?

Sí, puedes usar git filter-branch .

El Pro Git Book tiene una buena sección sobre la eliminación de objects de la historia

 --index-filter <command> 

Este es el filter para reescribir el índice. Es similar al filter de tree, pero no revisa el tree, lo que lo hace mucho más rápido. Frecuentemente utilizado con git rm --cached --ignore-unmatch … , vea los EJEMPLOS a continuación. Para casos peludos, vea git-update-index (1).

Entonces como un ejemplo:

 git filter-branch \ --index-filter 'git rm --cached --ignore-unmatch filename' \ --tag-name-filter cat \ -- --all 

El tag-name-filter está ahí para reescribir sus tags también, para que no las pierda.

Renuncia

Tenga cuidado de reescribir la historia pública. Puede hacer que sea imposible / difícil para los demás mantenerse actualizados o contribuir.

http://help.github.com/removing-sensitive-data/

No elimina datos confidenciales, pero parece que esto es lo que estás buscando.

git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.<filetype>' HEAD

Por lo que sé, git no hará esto retroactivamente. Tienes que git rm --cached o git rm --cached .