Aplicando .gitignore a archivos comprometidos


436

He cometido un montón de archivos que ahora quiero ignorar. ¿Cómo puedo decirle a git que ahora ignore estos archivos de futuras confirmaciones?

EDITAR: también quiero eliminarlos del repositorio. Son archivos creados después de la compilación o para el soporte de herramientas específicas del usuario.


1
posible duplicado del archivo .gitignore que no se ignora
Wooble

8
@Wooble La respuesta puede ser similar, pero esta pregunta describe exactamente el problema al que me enfrenté y que necesitaba resolver.
rjmunro

1
Esta es la respuesta que aborda directamente la pregunta del título con cambios mínimos en su repositorio de git: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Respuestas:


472

12
Sin embargo, hay muchos archivos. No quiero tener que hacer esto para cada uno
user880954

1
¿Están los archivos en directorios comunes? Si no, el problema se reduce a una pregunta de uso de shell, no a una pregunta git.
Matt Ball el

12
Es necesario que aparezca un "Olvidé agregar mi .gitignore hasta después del modo de confirmación inicial".
Luke Puplett el

99
La respuesta está debajo de esta.
Lopsided

3
Me pidió que agregue flag -r para poder hacerlo.
Vishal Gulati

601

Después de editar .gitignorepara que coincida con los archivos ignorados, puede hacer git ls-files -ci --exclude-standardpara ver los archivos que se incluyen en las listas de exclusión; entonces puedes hacer

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

para eliminarlos del repositorio (sin eliminarlos del disco).

Editar : también puede agregar esto como un alias en su archivo .gitconfig para que pueda ejecutarlo cuando lo desee. Simplemente agregue la siguiente línea en la sección [alias] (modifique según sea necesario para Windows o Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(La -rmarca en xargsevita que se git rmejecute en un resultado vacío e imprima su mensaje de uso, pero solo GNU findutils xargspuede admitirlo. Otras versiones de mayo o mayo no tienen una opción similar).

¡Ahora puede escribir git apply-gitignoresu repositorio y hará el trabajo por usted!


10
Creo que xargs para mac no tiene -r ... o el mío tiene errores / viejo, no lo sé ... y ¿por qué el !git anterior? bueno ... el mío funcionó como alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino

18
En Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett

Esto simplemente eliminó mis archivos .gitignore, no los archivos que quería ignorar que estaban enumerados en los archivos .gitignore, ¿ese era el punto?
Hippyjim

@Hippyjim si los archivos ya están confirmados (a pesar de que estaban listados en .gitignore), y .gitignore aún no está confirmado, entonces ese sería el resultado esperado, de lo contrario, no estoy seguro de lo que está sucediendo en su caso.
Jonathan Callen

1
Para usuarios de mac, -res predeterminado y no es aceptado por las versiones BSD. Así que elimínalo -r.
Weishi Zeng

136

para dejar el archivo en el repositorio pero ignorar los cambios futuros en él:

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

y para deshacer esto:

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

para averiguar qué archivos se han configurado de esta manera:

git ls-files -v|grep '^h'

crédito por la respuesta original a http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
Chronial tiene una excelente respuesta para hacer esto de forma recursiva para un directorio: stackoverflow.com/a/16346756/1101076
jordan314

Quería confirmar una configuración IDE pero no rastrear cambios innecesarios. Esto funciona, aunque no estoy seguro de si funcionará para otros que revisan el repositorio. Se puede combinar con git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedsi eso ayuda.
dlamblin

77
Esta es la única respuesta que hace precisamente lo que pide la pregunta del título. ¡PERFECTO! La mayoría de estas otras respuestas estaban jugando con archivos innecesariamente.
kayleeFrye_onDeck

1
Esta es la respuesta correcta para la pregunta. El uso de comandos como git rm --cachedeliminará el archivo en el repositorio, lo que no satisface la necesidad de quizzer. Gracias. Realmente lo aprecio. Tu respuesta me ayuda mucho.
ramwin

88

Asegúrese de que su repositorio real sea la última versión

  1. Edita .gitignorecomo quieras
  2. git rm -r --cached .
  3. git add .

luego cometer como de costumbre


14
Esta debería ser la respuesta aceptada ya que la pregunta específicamente decía que había muchos archivos para eliminar.
nbeuchat

3
Tenga en cuenta que el paso 2 puede llevar un tiempo si tiene un gran repositorio.
brainbag

¡Esto solo condujo a la eliminación de todos los archivos del índice! Esto me salvó: git reset HEAD(Recuerde guardar cualquier cambio)
aksh1618

2
El paso 2 elimina todo, sí, pero el paso 3 debería leerlos todos, excepto los que fallan debido a .gitignore.
compre el

11

Antigua pregunta, pero algunos de nosotros estamos en git-posh(powershell). Esta es la solución para eso:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

Sigue estos pasos:

  1. Agregar ruta al gitignorearchivo

  2. Ejecute este comando

    git rm -r --cached foldername
    
  3. cometer cambios como de costumbre.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.