Pregunta ¿Cómo hacer que Git "se olvide" de un archivo que fue rastreado pero que ahora está en .gitignore?


Hay un archivo que estaba siendo rastreado por git, pero ahora el archivo está en el .gitignore lista.

Sin embargo, ese archivo sigue apareciendo en git status después de ser editado ¿Cómo se fuerza git olvidar por completo?


3645
2017-08-13 19:23


origen


Respuestas:


.gitignore evitará que se agreguen archivos sin seguimiento (sin un add -f) al conjunto de archivos rastreados por git, sin embargo, git continuará rastreando los archivos que ya están siendo rastreados.

Para detener el seguimiento de un archivo, debe eliminarlo del índice. Esto se puede lograr con este comando.

git rm --cached <file>

La eliminación del archivo de la revisión del jefe ocurrirá en el próximo commit.


3872
2017-08-13 20:40



La serie de comandos a continuación eliminará todos los elementos del índice de Git (no del directorio de trabajo ni del repositorio local), y luego actualiza el índice de Git, mientras se respeta git. PD. Índice = Caché

Primero:

git rm -r --cached . 
git add .

Entonces:

git commit -am "Remove ignored files"

1990
2017-09-30 13:51



git update-index hace el trabajo por mí:

git update-index --assume-unchanged <file>

Nota: Esta solución es realmente independiente en .gitignore como gitignore es solo para archivos sin seguimiento.

editar: Desde que se publicó esta respuesta, se ha creado una nueva opción que debería preferirse. Deberías usar --skip-worktree que es para archivos modificados rastreados que el usuario ya no quiere comprometer y mantener --assume-unchanged para el rendimiento a fin de evitar que git verifique el estado de los grandes archivos rastreados. Ver https://stackoverflow.com/a/13631525/717372 para más detalles...


739
2017-11-27 11:24



git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Esto toma la lista de los archivos ignorados y los elimina del índice, luego confirma los cambios.


217
2018-05-23 22:29



Siempre uso este comando para eliminar esos archivos sin seguimiento. Una línea, estilo Unix, salida limpia:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Enumera todos sus archivos ignorados, reemplaza cada línea de salida con una línea entrecomillada en su lugar para manejar las rutas con espacios adentro, y pasa todo a git rm -r --cached para eliminar las rutas / archivos / directorios del índice.


59
2018-06-19 15:42



Si tu no puedes git rm un archivo rastreado porque otras personas pueden necesitarlo (advertencia, incluso si   git rm --cached, cuando alguien más recibe este cambio, sus archivos serán eliminados en su sistema de archivos) por favor mire https://gist.github.com/1423106 para formas en que las personas han solucionado el problema.


49
2017-07-19 00:08



moverlo, comprometerse, y luego volver a moverlo. Esto funcionó para mí en el pasado. Probablemente exista una forma más "tonta" de lograr esto.


43
2017-08-13 19:27



Lo que no funcionó para mí

(Bajo Linux), quería usar las publicaciones aquí sugiriendo ls-files --ignored --exclude-standard | xargs git rm -r --cached enfoque. Sin embargo, (algunos de) los archivos que se eliminaron tenían una nueva línea incrustada / LF /\n en sus nombres. Ninguna de las soluciones:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

hacer frente a esta situación (obtener errores sobre los archivos no encontrados).

Entonces yo ofrezco

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

Esto usa el -z argumento para ls-files, y el -0 argumento para xargs para atender con seguridad / correctamente los caracteres "desagradables" en los nombres de archivo.

En la página de manual git-ls-files (1), afirma:

Cuando no se usa la opción -z, los caracteres TAB, LF y barra inclinada invertida en   las rutas se representan como \ t, \ n y \\, respectivamente.

entonces creo que mi solución es necesaria si los nombres de archivo tienen alguno de estos caracteres en ellos.

EDITAR: me han pedido que agregue eso --- como cualquier git rm comando --- esto debe ser seguido por un cometer para hacer que las eliminaciones sean permanentes, p. git commit -am "Remove ignored files".


37
2017-12-29 12:50