¿Cómo puedo hacer que Git "olvide" un archivo del que se realizó un seguimiento, pero ahora está en .gitignore?

Hay un archivo que es seguido por git , pero ahora el archivo está en la lista .gitignore .

Sin embargo, este archivo continúa git status en git status después de editarlo. ¿Cómo haces que git se olvide por completo?

4082
13 авг. set iván 13 ago. 2009-08-13 22:23 '09 a las 10:23 AM 2009-08-13 22:23
@ 22 respuestas

.gitignore evitará que .gitignore archivos no rastreados (sin add -f ) al conjunto de archivos rastreados por git, pero git continuará rastreando cualquier archivo que ya haya sido rastreado.

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

 git rm --cached <file> 

La eliminación de un archivo del encabezado de revisión se producirá en la próxima confirmación.

NOTA: Aunque esto no eliminará el archivo físico de su archivo local, eliminará los archivos de las máquinas de otros desarrolladores con la próxima git pull .

4329
13 авг. Respuesta dada por CB Bailey 13 de agosto 2009-08-13 23:40 '09 a las 11:40 pm 2009-08-13 23:40

En la secuencia de comandos a continuación, todos los elementos del índice de Git se eliminarán (no del directorio de trabajo o del repositorio local), y luego se actualizará el índice de Git, mientras que se ignorará Git. Salmo Índice = Caché

En primer lugar

 git rm -r --cached . git add . 
border=0

Entonces

 git commit -am "Remove ignored files" 
2209
30 сент. La respuesta es dada por Matt Frear 30 sep . 2013-09-30 16:51 '13 a las 16:51 2013-09-30 16:51

git update-index hace todo el trabajo por mí:

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

Nota Esta solución es virtualmente independiente de .gitignore ya que gitignore está diseñado solo para archivos sin seguimiento.

cambio: desde que se publicó esta respuesta, se creó una nueva opción, y esta debería ser la preferida. Debe usar --skip-worktree que está destinado a los archivos monitorizados modificados que el usuario ya no quiere arreglar, y guarda --assume-unchanged para un mejor rendimiento, para que git no verifique el estado de los grandes archivos monitoreados. Consulte delphi-faq.net.site/questions/1817 / ... para obtener más información ...

 git update-index --skip-worktree <file> 
830
27 нояб. Konstantin da la respuesta el 27 de noviembre. 2013-11-27 14:24 '13 a las 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

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

237
24 мая '14 в 1:29 2014-05-24 01:29 La respuesta se da thSoft 24 de mayo, 14 a 1:29 2014-05-24 01:29

Siempre uso este comando para eliminar estos archivos no reproducibles. 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, reemplazados por una línea con comillas en lugar de cada línea de salida para procesar rutas con espacios dentro y pasar todo a git rm -r --cached para eliminar rutas / archivos / directorios del índice.

62
19 июня '15 в 18:42 2015-06-19 18:42 La respuesta fue dada por David Hernández el 19 de junio de '15 a las 6:42 pm 2015-06-19 18:42

Si no puede git rm archivo supervisado porque otras personas pueden necesitarlo (una advertencia, incluso si presiona git rm --cached cuando alguien más recibe este cambio, sus archivos se eliminarán de su sistema de archivos). Esto se hace a menudo debido a la anulación del archivo de configuración, las credenciales de autenticación, etc. Mire https://gist.github.com/1423106 para conocer las formas en que las personas evitaron el problema.

Para resumir:

  • Pida a su aplicación que encuentre el archivo config-overide.ini que falta y lo use sobre el archivo config.ini capturado (o, alternativamente, encuentre ~ / .config / myapp.ini o $ MYCONFIGFILE)
  • Arregle el archivo config-sample.ini e ignore el archivo config.ini, si es necesario, cree un script o un archivo similar para copiar.
  • Intente usar la magia clean / smudge de gitattributes para aplicar y eliminar cambios, por ejemplo, difuminar el archivo de configuración como un extracto de una rama alternativa y borrar el archivo de configuración como un extracto de HEAD. Esto es una cosa difícil, no lo recomiendo para un usuario novato.
  • Guarde el archivo de configuración en su rama de implementación dedicada, que nunca se fusionará con el maestro. Cuando desea implementar / compilar / probar, fusionarse con esta rama y obtener este archivo. En esencia, este es el enfoque de borrado / limpieza, con la excepción de usar políticas de combinación de personas y módulos git adicionales.
  • Anti-recomendación: no use suposiciones sin cambios, terminará solo con lágrimas (porque una mentira falsa en sí misma puede llevar a cosas malas, como la posibilidad de que sus cambios se pierdan para siempre).
53
19 июля '12 в 3:08 2012-07-19 03:08 La respuesta es dada por Seth Robertson el 19 de julio de 2012 a las 3:08 2012-07-19 03:08

Muévalo, ciérrelo y luego devuélvalo. Funcionó para mí en el pasado. Probablemente hay una manera para que Gittier haga esto.

51
13 авг. Respuesta dada por Joel Hooks 13 de agosto 2009-08-13 22:27 '09 a las 10:27 pm 2009-08-13 22:27

Use esto cuando:

1. Quieres formatear muchos archivos o

2. Has actualizado tu archivo gitignore.

Enlace a la fuente: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Supongamos que ya ha agregado / transferido algunos archivos a su repositorio git, y luego los ha agregado a su.gitignore; Estos archivos todavía estarán presentes en el índice de su repositorio. En este artículo veremos cómo deshacernos de ellos.

Paso 1: Confirma todos tus cambios.

Antes de continuar, asegúrese de que todos los cambios estén confirmados, incluido el archivo .gitignore.

Paso 2. Eliminar todo del repositorio.

Para borrar su repositorio, use:

 git rm -r --cached . 
  • rm - eliminar comando
  • -r permitirá la eliminación recursiva
  • -Cacheado solo eliminará archivos del índice. Sus archivos todavía estarán allí.

El comando rm puede ser implacable. Si quiere probar lo que hace por adelantado, agregue -n o --dry-run para verificar todo.

Paso 3: Añadir todos

 git add . 

Paso 4: Arreglar

 git commit -m ".gitignore fix" 

Tu repositorio está limpio :)

Haga clic en los cambios en el control remoto para ver los cambios que también son efectivos allí.

40
22 апр. Respuesta dada por Dheeraj Bhaskar el 22 de abril. 2018-04-22 21:11 '18 a las 9:11 pm 2018-04-22 21:11

Lo que no me funcionó

(En Linux) quería usar mensajes que sugieran el ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . Sin embargo, (algunos de) los archivos a eliminar tenían caracteres de nueva línea / LF / \n incrustados 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 

lidiar con esta situación (obtener errores sobre los archivos no encontrados).

Por lo tanto, sugiero

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

Utiliza el argumento -z para los archivos ls , y el argumento -0 usa xargs para usar de forma segura / correcta los caracteres "desagradables" en los nombres de archivo.

La página del manual de git-ws-files (1) dice:

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

así que creo que mi solución es necesaria si los nombres de los archivos contienen alguno de estos caracteres.

EDITAR: Me pidieron que agregue eso --- como cualquier comando git rm - debe ir seguido de un compromiso para que la eliminación sea permanente, por ejemplo. git commit -am "Remove ignored files" .

38
29 дек. La respuesta es dada por JonBrave el 29 de diciembre. 2015-12-29 15:50 '16 a las 15:50 2015-12-29 15:50

Hice esto usando la rama git del filtro . El comando exacto que usé fue tomado de la página del manual:

ADVERTENCIA : esto eliminará el archivo de todo el historial.

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

Este comando recrea todo el historial de confirmación ejecutando git rm antes de cada confirmación y, por lo tanto, elimina el archivo especificado. Recuerde realizar una copia de seguridad antes de ejecutar el comando, ya que se perderá.

35
13 авг. La respuesta se da drrlvn 13 ago. 2009-08-13 22:35 '09 a las 10:35 AM 2009-08-13 22:35
  • Actualice el archivo .gitignore ; por ejemplo, agregue una carpeta en la que no desee realizar un seguimiento de .gitignore .

  • git rm -r --cached . - eliminar todos los archivos rastreados, incluidos los no deseados y no deseados. Su código estará seguro si lo guardó localmente.

  • git add . - Se volverán a agregar todos los archivos, excepto los especificados en .gitignore .


Consejo @AkiraYamamoto sombreros para apuntar en la dirección correcta.

18
04 апр. La respuesta se da Chen_Wayne 04 abr. 2016-04-04 07:09 '16 a las 7:09 2016-04-04 07:09

Creo que, tal vez, git no puede olvidarse completamente del archivo debido a su concepto ( la sección "Imágenes, no la diferencia" ).

Falta este problema, por ejemplo, cuando se usa CVS. CVS almacena información como una lista de cambios basada en archivos. La información para CVS es una colección de archivos y cambios realizados en cada archivo a lo largo del tiempo.

Pero en git, cada vez que confirma o guarda el estado de su proyecto, básicamente toma una imagen de cómo se ven todos sus archivos en el momento y almacena un enlace a esta instantánea. Por lo tanto, si agregó un archivo una vez, siempre es Estará presente en esta instantánea.

Estos 2 artículos me fueron útiles:

git supone que no hay cambios frente a skip-worktree y cómo ignorar los cambios en los archivos rastreados utilizando git

En base a esto, hago lo siguiente si el archivo ya está registrado:

 git update-index --skip-worktree <file> 

A partir de este momento, todos los cambios locales en este archivo se ignorarán y no se eliminarán. Si el archivo se cambia a uno remoto, se producirá un conflicto cuando git pull . Parar no funcionará. Para resolver el problema, copie el contenido del archivo en un lugar seguro y siga estos pasos:

 git update-index --no-skip-worktree <file> git stash git pull 

El contenido del archivo será reemplazado por el contenido eliminado. Pegue sus cambios desde un lugar seguro al archivo y vuelva a ejecutar:

 git update-index --skip-worktree <file> 

Si todos los que trabajan con el proyecto ejecutan git update-index --skip-worktree <file> , no debería haber problemas con la pull . Esta solución es adecuada para archivos de configuración cuando cada desarrollador tiene su propia configuración de proyecto.

Esto no es muy conveniente hacerlo cada vez que se cambia un archivo en una computadora remota, pero puede evitar que se sobrescriba con contenido remoto.

12
21 мая '17 в 18:12 2017-05-21 18:12 la respuesta se da Boolean_Type 21 de mayo de '17 a 6:12 2017-05-05 18:12

Copiar / Pegar Respuesta: git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Este comando ignorará los archivos que ya se han transferido al repositorio de Git, pero ahora los hemos agregado a .gitignore .

5
19 нояб. La respuesta es dada por ustedes, el 19 de noviembre. 2018-11-19 14:21 '18 a las 2:21 pm 2018-11-19 14:21

La respuesta de Matt Fear fue la IMHO más efectiva. El siguiente es solo un script de PowerShell para aquellos que, solo en Windows, eliminan archivos de su repositorio git, que corresponde a su lista de excepciones.

 # Get files matching exclusionsfrom .gitignore # Excluding comments and empty lines $ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % { $ignore = "*" + $_ + "*" (gci -r -i $ignore).FullName } $ignoreFiles = $ignoreFiles| ?{$_ -match "\S"} # Remove each of these file from Git $ignoreFiles | % { git rm $_} git add . 
5
25 дек. La respuesta la da Ameer Deen el 25 de diciembre. 2013-12-25 03:51 '13 a las 3:51 2013-12-25 03:51

Mueva o copie el archivo a un lugar seguro para que no lo pierda. Luego git rm file y commit. El archivo se mostrará si vuelve a una de estas confirmaciones anteriores o a otra rama donde no se haya eliminado. Sin embargo, en todas las confirmaciones futuras, no volverá a ver el archivo. Si el archivo está en git para ignorarlo, puede volver a moverlo a la carpeta, y git no lo verá.

5
13 авг. Respuesta dada por Apreche 13 de agosto. 2009-08-13 22:27 '09 a las 10:27 pm 2009-08-13 22:27

Realice los siguientes pasos alternativamente, todo estará bien.

1. Eliminar archivos agregados erróneamente del directorio / repositorio . Puede usar el comando "rm -r" (para linux) o eliminarlos al navegar por los directorios.

2.add archivos / directorios en el archivo gitignore y guárdelo.

3. Ahora elimínelos de la caché de git usando estos comandos (si hay varios directorios, elimínelos uno por uno y vuelva a emitir este comando)

 git rm -r --cached path-to-those-files 

4. Ahora confíe y presione , use estos comandos. Esto eliminará estos archivos del git remoto y hará que git deje de rastrear esos archivos.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. La respuesta la da Shamsul Arefin Sajib 20 de septiembre. 2018-09-20 13:52 '18 a la 1:52 pm 2018-09-20 13:52

BFG está diseñado específicamente para eliminar datos no deseados, como archivos grandes o contraseñas de los repositorios de Git, por lo que tiene un indicador simple que eliminará cualquier archivo histórico grande (no el actual): "-strip-blobs-more-than"

 $ java -jar bfg.jar --strip-blobs-bigger-than 100M 

Si desea especificar archivos por nombre, también puede hacer esto:

 $ java -jar bfg.jar --delete-files *.mp4 

BFG es 10-1000x más rápido que la rama del filtro Git y, por lo general, es mucho más fácil de usar; consulte las instrucciones para un uso completo y ejemplos para obtener más detalles.

Fuente: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3
03 сент. Respuesta dada por Meir Gerenstadt 03 sep. 2017-09-03 15:37 '17 a las 3:37 pm 2017-09-03 15:37

Me gustó la respuesta de JonBrave, pero tengo directorios de trabajo bastante sucios que corrigen -a, me asusta un poco, así que eso fue lo que hice:

git config --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage.gitignore git commit -m "nuevo gitignore y eliminar archivos ignorados del índice"

destrucción:

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage .gitignore git commit -m "new gitignore and remove ignored files from index" 
  • eliminar archivos ignorados del índice
  • Stage.gitignore y los archivos que acaba de eliminar.
  • comprometerse
2
08 авг. La respuesta la da Jay Irvine 08 ago. 2018-08-08 23:49 '18 a las 11:49 PM 2018-08-08 23:49

Si no desea usar la CLI y trabajar con Windows, una solución muy simple es usar TortoiseGit , tiene la acción "Eliminar (guardar local)" en el menú, que funciona bien.

2
15 марта '18 в 14:04 2018-03-15 14:04 La respuesta es dada por Pedi T. 15 de marzo, 18 a las 2:04 p . M. 2018-03-15 14:04

Esto ya no es un problema en el último git (v2.17.1 en el momento de la escritura).

En .gitignore ignoran los archivos rastreados, pero se eliminan. Puede verificar esto usted mismo ejecutando el siguiente script. La expresión de git status final de git status debería decir "no hacer nada".

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 Lloyd dio respuesta el 13 de junio de 18 a las 7:21 pm 2018-06-13 19:21

En el caso de un DS_Store ya comprometido:

 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 

Ignorarlos

 echo ".DS_Store" >> ~/.gitignore_global echo "._.DS_Store" >> ~/.gitignore_global echo "**/.DS_Store" >> ~/.gitignore_global echo "**/._.DS_Store" >> ~/.gitignore_global git config --global core.excludesfile ~/.gitignore_global 

Por último, haz una corrección!

0
23 апр. la respuesta la da el usuario 7718859 23 de abril. 2018-04-23 00:14 '18 a las 0:14 2018-04-23 00:14

En mac

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. Borre los archivos DS_Store de la lista de archivos rastreados por git en la rama foo:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. Cometer:

 $ git commit -m "Removed .DS_Store files" 

3. Compruebe que los archivos ya no se rastrean.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Haz clic para eliminarlos de la consola:

 $ git push 
-5
13 янв. Respuesta dada por Raphvanns el 13 de enero. 2017-01-13 22:53 '17 a las 10:53 2017-01-13 22:53

Otras preguntas sobre las etiquetas o Haz una pregunta