Aplique .gitignore en un repositorio existente que ya rastrea una gran cantidad de archivos


314

Tengo un proyecto Visual Studio existente en mi repositorio. Recientemente agregué un archivo .gitignore en mi proyecto y supongo que eso le dice a Git que ignore los archivos enumerados en el archivo.

Mi problema es que todos esos archivos ya están siendo rastreados y, hasta donde yo sé, Git no ignorará un archivo que ya fue rastreado antes de agregar una regla a este archivo para ignorarlo.

Se sugirió usar: git rm --cachedy des-rastrearlos manualmente, pero eso me llevará una eternidad revisarlos uno por uno.

Pensé en eliminar el repositorio y volver a crearlo nuevamente, pero esta vez con el archivo .gitignore presente, pero debe haber una mejor manera de hacerlo.


1
puedes git rm --cachedusar directorios completos con la -ropción, si eso es útil
Nathan Wallace


1
posible duplicado de Ignorar archivos que ya se han
enviado

Respuestas:


871

Esta respuesta resolvió mi problema:

En primer lugar, confirme todos los cambios pendientes.

Luego ejecute este comando:

git rm -r --cached .

Esto elimina todo del índice, luego solo ejecuta:

git add .

Compromételo:

git commit -m ".gitignore is now working"

99
Respuesta perfecta ! Agregue git push origintambién un para reflejar los cambios en el repositorio remoto.
Sanket Berde

8
Comencé a usar esta respuesta ... ¡y eliminó casi todo en mi proyecto! Obviamente estaba haciendo algo mal. Pero quiero advertir a la gente que no sigan esta sugerencia casualmente.
Mark Olbert

44
¿Esto acabar perdiendo la historia de los archivos cuando se quita y volver a añadirlos
Aran Mulholland

10
Me pregunto cuántas confirmaciones hay usando este .gitignore is now workingmensaje. :)
ihavenoidea

1
Este método funcionó bien para mí. Creé un archivo gitignore, ignoré un directorio completo y luego cometí este cambio de crear el gitignore. Luego seguí estos tres comandos anteriores exactamente como me dijeron. Funcionó perfectamente, pero debo decir que primero debe "confirmar todos los cambios pendientes" como se indicó anteriormente.
Erich Meissner

61
  1. Cree un archivo .gitignore, por lo que para hacerlo, simplemente cree cualquier archivo .txt en blanco.

  2. Luego debe cambiar su nombre escribiendo la siguiente línea en el cmd (donde git.txtestá el nombre del archivo que acaba de crear):

    rename git.txt .gitignore

  3. Luego puede abrir el archivo y escribir todos los archivos sin seguimiento que desea ignorar para siempre. Por ejemplo, el mío se ve así:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Hay una colección completa de archivos .gitignore útiles de GitHub

  1. Una vez que tenga esto, debe agregarlo a su repositorio git como cualquier otro archivo, solo que debe estar en la raíz del repositorio.

  2. Luego, en su terminal, debe escribir la siguiente línea:

    git config --global core.excludesfile ~ / .gitignore_global

Desde el documento oficial:

También puede crear un archivo .gitignore global, que es una lista de reglas para ignorar archivos en cada repositorio de Git en su computadora. Por ejemplo, puede crear el archivo en ~ / .gitignore_global y agregarle algunas reglas.

Terminal abierta Ejecute el siguiente comando en su terminal: git config --global core.excludesfile ~ / .gitignore_global

Si el repositorio ya existe, debe ejecutar estos comandos:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Si el paso 2 no funciona, debe escribir la ruta del agujero de los archivos que desea agregar.


44
@Karen_Wiznia la "configuración de git ... _global" crea un gitingore global para todos los repositorios de Git en la computadora. El OP no quería hacer eso.
ivan7707

Desearía poder gustar esto más de una vez, continuamente vuelvo a esta pregunta buscando este recordatorio.
Antony D'Andrea

1
Debería ser "mv git.txt .gitignore" en lugar de "cambiar el nombre de git.txt .gitignore".
Ahmad F

30

Como se especifica aquí Puede actualizar el índice:

git update-index --assume-unchanged /path/to/file

Al hacer esto, los archivos no aparecerán en git statuso git diff.

Para comenzar a rastrear los archivos nuevamente, puede ejecutar:

git update-index --no-assume-unchanged /path/to/file

55
Esta es la mejor respuesta: se centra solo en el archivo único, el archivo que no desea que el repositorio rastree. La respuesta marcada más alta también funcionará, pero hace mucho más que simplemente ignorar un archivo del seguimiento por git.
Chris Mejka

1
Este es bueno. Pero, ¿y si tiramos? ¿Hay algún conflicto de fusión?
pramod

@pramod, gran pregunta. No estoy realmente seguro. ¿Probarlo en un repositorio de prueba simplificado?
Patrick James McDougle

15

Si agregaste tu .gitignore demasiado tarde, git continuará rastreando los archivos ya confirmados independientemente. Para solucionar esto, siempre puede eliminar todas las instancias almacenadas en caché de los archivos no deseados.

Primero, para verificar qué archivos está rastreando realmente, puede ejecutar:

git ls-tree --name-only --full-tree -r HEAD

Digamos que encontró archivos no deseados en un directorio como este cache/, es más seguro dirigirse a ese directorio en lugar de a todos sus archivos.

Entonces en lugar de:

git rm -r --cached .

Es más seguro apuntar al archivo o directorio no deseado:

git rm -r --cached cache/

Luego proceda a agregar todos los cambios,

git add .

y comprometerse ...

git commit -m ".gitignore is now working"

Referencia: https://amyetheredge.com/code/13.html


Esta es la mejor y limpia respuesta si desea eliminar solo unos pocos archivos, no todo el repositorio. Te doy mi pulgar hacia arriba.
Apuig

2

Aquí hay una manera de "destrabar" cualquier archivo que de otro modo se ignoraría bajo el conjunto actual de patrones de exclusión:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Esto deja los archivos en su directorio de trabajo pero los elimina del índice.

El truco utilizado aquí es proporcionar un archivo de índice inexistente para git ls-files para que piense que no hay archivos rastreados. El código de shell anterior solicita todos los archivos que se ignorarían si el índice estuviera vacío y luego los elimina del índice real con git rm.

Después de que los archivos hayan sido "no rastreados", use el estado de git para verificar que no se eliminó nada importante (si es así, ajuste sus patrones de exclusión y use git reset - path para restaurar la entrada de índice eliminada). Luego, haga una nueva confirmación que omita el "error".

La "crisis" todavía estará en cualquier compromiso viejo. Puede usar git filter-branch para producir versiones limpias de los commits antiguos si realmente necesita un historial limpio (nb usando git filter-branch "reescribirá el historial", por lo que no debe realizarse a la ligera si tiene algún colaborador que haya retirado cualquiera de sus confirmaciones históricas después de que se introdujo por primera vez la "crisis".


suena como una solución sólida :) Supongo que esto es para shell de Linux ¿verdad? desafortunadamente soy un usuario de Win7. ¿De alguna manera puedo hacer esto en Windows?
Tohid

0

Eliminar archivos del área de preparación

git reset HEAD .

Agregar todos los cambios

git add .

Compromételo:

git commit -m ".gitignore is now working"

-1

Creo que esta es una manera fácil de agregar un archivo .gitignore a un repositorio existente.

Prerrequisito :

Necesita un navegador para acceder a su cuenta de github.

Pasos

  1. Cree un nuevo archivo en su proyecto requerido (existente) y asígnele el nombre .gitignore . Obtendrá un mensaje sugerente para las plantillas .gitignore tan pronto como nombre el archivo como .gitignore . Utilice estas plantillas o use gitignore.io para generar el contenido de su archivo gitignore .
  2. Cometer los cambios.
  3. Ahora clone este repositorio.

¡Que te diviertas!


-3

Utilice git clean
Obtener ayuda en esta ejecución

git clean -h

Si desea ver qué sucedería primero, asegúrese de pasar el interruptor -n para una ejecución en seco:

git clean -xn

Para eliminar la basura gitingnored

git clean -xdf

Cuidado: puede estar ignorando archivos de configuración locales como database.yml que también se eliminarían. Úselo bajo su propio riesgo.

Luego

git add .
git commit -m ".gitignore is now working"
git push
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.