¿Cómo puedo eliminar completamente un archivo de un repositorio de git?

78

Recientemente me di cuenta de que los archivos del proyecto que usan mis editores de texto (junto con otros archivos basura) se agregaron al repositorio git para el proyecto. Dado que en realidad no son parte del proyecto, me gustaría eliminarlos, pero git rmno elimino las versiones anteriores del repositorio, y no pude encontrar nada más que parezca prometedor.

David X
fuente
5
duplicado parcial, definitivamente cubierto por preguntas anteriores: stackoverflow.com/questions/307828/… stackoverflow.com/questions/1216733/…
Cascabel

Respuestas:

140

La herramienta que desea es git filter-branch. Su uso se describe aquí , pero básicamente:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD

eliminará "my_file" de cada confirmación.

Tenga en cuenta que esto reescribe cada confirmación, por lo que si ingresa a un repositorio remoto, debe (a) forzar la actualización, y (b) todos los demás que sacaron de usted ahora tendrán confirmaciones duplicadas (ya que reescribió el historial), como descrito en la git rebasepágina del manual .

mipadi
fuente
19
Recomiendo agregar --prune-emptypara que también se eliminen las confirmaciones vacías generadas como resultado.
fnkr
¿Cómo funciona esto en un repositorio con muchos archivos con el mismo nombre en diferentes directorios? ¿Elimina todos los archivos con el mismo nombre?
2
@CodeMonkey: En ese caso, usaría una ruta única más larga.
mipadi
1
más tarde debo hacer git push --force? @mipadi
Alper
1
@mipadi, ¿y si borré estos archivos localmente, hace mucho tiempo? (y comprometido y enviado estas eliminaciones) ¿Cómo puedo eliminar los archivos del repositorio en este caso?
mannyglover
11

Para esto es git filter-branch, pero tenga en cuenta que su historial de repositorios cambiará y los hashes de confirmación serán diferentes después de la reescritura del historial.

Si también desea liberar espacio, le recomiendo que lo use git forget-blob, porque por git filter-branchsí solo no hará que git olvide su archivo, ya que aún puede ser referenciado por controles remotos, reflog, etiquetas y demás.

git forget-blob main.c.swp

Puedes obtener más información aquí

nachoparker
fuente