2009-03-09 8 views
24

Anteriormente, la siguiente fue mi .gitignore archivo:¿Cómo ignorar un archivo que ya está comprometido?

... 
config/database.yml 
.DS_Store 

Más tarde creó un archivo app_config.yml en el directorio config y cometió.

Ahora, me di cuenta de que no necesito el archivo app_config.yml en el repositorio de git. Y he modificado mi .gitignore archivo:

... 
config/app_config.yml 
config/database.yml 
.DS_Store 

Ahora, cuando me comprometo, que app_config.yml archivo está todavía en mi repo. Quiero eliminar ese archivo de mi repositorio. ¿Cómo puedo hacerlo?

Respuesta

43

Como lo mencionan en "ignoring doesn't remove a file"
(la siguiente cita del genial artículo de Nick Quaranto,
en su blog git ready "aprender git uno se comprometen a la vez"):

Cuando le dices a Git que ignore los archivos, solo va a dejar de ver los cambios para ese archivo, y nada más.
Esto significa que el historial aún recordará el archivo y lo tendrá
.

Si desea eliminar un archivo del repositorio, pero mantenerlo en su directorio de trabajo, basta con utilizar:

git rm --cached <file> 

Sin embargo, esto todavía va a mantener el archivo de la historia.

Si realmente desea eliminarlo de la historia, que realmente tiene dos opciones:

  • reescribir confirmaciones de su repositorio, o
  • empezar de nuevo.

Ambas opciones realmente apestan, y eso por una buena razón: Git se esfuerza por no perder sus datos.
Al igual que con el rebasado, Git te obliga a pensar en este tipo de opciones ya que son operaciones destructivas.

Si realmente desea eliminar un archivo del historial, git filter-branch es la sierra para metales que está buscando.
Definitivamente, lea en su manpage antes de usarlo, ya que literalmente reescribirá las confirmaciones de su proyecto. En realidad, esta es una gran herramienta para algunas acciones, y puede hacer todo tipo de cosas, como eliminar totalmente las confirmaciones de un autor para mover la carpeta raíz del proyecto.El comando para eliminar un archivo de todas las revisiones es:

git filter-branch --index-filter 'git rm --cached <file>' HEAD 

Esta acción sin duda puede ser útil cuando se necesita para soplar la información sensible o confidencial que se ha colocado en su repositorio

Cuestiones relacionadas