Cómo ignorar ciertos archivos en Git

731

Tengo un repositorio con un archivo, Hello.java . Cuando lo compilo, Hello.classse genera un archivo adicional .

Creé una entrada para Hello.class en un .gitignorearchivo. Sin embargo, el archivo todavía parece estar rastreado.

¿Cómo puedo hacer que Git ignore Hello.class?

Kohan95
fuente
8
¿Qué quieres decir con "no funciona"? ¿Quizás ya haya agregado Hello.class a su repositorio? Los gitignores no tienen efecto en el contenido que ya se ha rastreado Ver por ejemplo stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel el

Respuestas:

810

El problema es que .gitignoreignora solo los archivos que no fueron rastreados antes (por git add). Ejecutar git reset name_of_filepara quitar el escenario del archivo y mantenerlo. En caso de que desee eliminar también el archivo dado del repositorio (después de presionar), use git rm --cached name_of_file.

Ondrej Slinták
fuente
190
El comando git rm --cached name_of_fileeliminará el archivo de su repositorio de git. Incluso si lo agrega a su archivo .gitignore. Eso no ignora lo que está eliminando.
OrwellHindenberg
44
Que parece ser lo que OP quería en este caso.
Ondrej Slinták
40
¡Me alegra que su solución haya funcionado para @ Kohan95! Aunque esta pregunta debe renombrarse según la respuesta seleccionada. Mis comentarios son solo una advertencia para los desarrolladores que pueden no estar al tanto de lo que hace el comando.
OrwellHindenberg
9191
git reset name_of_fileelimina el seguimiento y no elimina el archivo.
Cees Timmerman
77
Intenté git rm --cached <name_of_file> Se eliminó el archivo en el repositorio, pero como estaba en el archivo .gitignore, la copia local no se eliminó. Como nota adicional, para agregar un directorio, debe colocarlo con una barra diagonal '/'. Estaba eliminando el directorio de configuración de Rubymine en un proyecto ruby ​​que alguien había registrado, que era ".idea". En el archivo puse ".idea /" y luego "git rm --cached -r .idea" para eliminar el directorio y todo lo que hay debajo (porque git solo versiona archivos, no directorios).
Doug Noel
222

Cómo ignorar nuevos archivos

Globalmente

Agregue la (s) ruta (s) a su (s) archivo (s) que le gustaría ignorar a su .gitignorearchivo (y confirme). Estas entradas de archivo también se aplicarán a otras personas que echen un vistazo al repositorio.

En la zona

Agregue la (s) ruta (s) a su (s) archivo (s) que le gustaría ignorar a su .git/info/excludearchivo. Estas entradas de archivo solo se aplicarán a su copia de trabajo local.

Cómo ignorar los archivos modificados (temporalmente)

Para ignorar que los archivos modificados se enumeren como modificados, puede usar el siguiente comando git:

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

Para revertir esa ignorancia, use el siguiente comando:

git update-index --no-assume-unchanged <file>
Xman Classical
fuente
¡Perfecto para evitar que un archivo que contiene una clave API actual sea empujado a github!
Jim In Texas
1
@ Xman ¿Por qué dijiste que es temporalmente? Hice los pasos que mencionó para localgit ignore y reinicié mi sistema, todavía muestra que funciona directamente limpio.
Vivek Vardhan
1
Gracias por el update-indextruco útil , absolutamente perfecto para evitar cambiar un .gitignorearchivo, que luego es rastreado por Git.
Thomas P.
@mcbjam No hay un comando especial git ignore. Edite un archivo .gitignore ubicado en el lugar apropiado dentro de la copia de trabajo. Luego debe agregar este .gitignore y confirmarlo. Todos los que clonen ese repositorio tendrán que ignorar esos archivos.
Xman Clásico
@Vivek Vardhan git update-index --asumir-sin cambios es como una máscara temporal en el índice. Permanecerá vigente hasta que lo apague. Para posiblemente aclarar mi punto, el índice inicialmente (es decir, justo después de git read-tree) "contiene" todos los archivos del tree-ish que acababan de ser leídos. De ahí que Git "haga la vista gorda" a una entrada de índice no equivale a eliminarla realmente.
Xman Clásico
150

Agregue la siguiente línea a .gitignore:

/Hello.class

Esto excluirá Hello.class de git. Si ya lo ha confirmado, ejecute el siguiente comando:

git rm Hello.class

Si desea excluir todos los archivos de clase de git, agregue la siguiente línea a .gitignore:

*.class
Armand
fuente
32
Agregar Hello.classa .gitignoreignorará cualquier archivo llamado Hello.classen cualquier subdirectorio. Si solo quiere ignorar el archivo Hello.classen el mismo directorio que el .gitignorearchivo, use una /Hello.classlínea en su lugar.
ndim
¿Dónde pones el .gitignorearchivo?
CodyBugstein
66
@Imray puede colocar .gitignoreen cualquier parte de un proyecto git: si una ruta comienza con /, será relativa a la ubicación del .gitignorearchivo; de lo contrario, se referirá recursivamente a los archivos en el directorio actual y sus directorios descendientes.
Armand
109

1) Crea un .gitignorearchivo. Para hacer eso, simplemente cree un .txtarchivo y cambie la extensión de la siguiente manera:

Ingrese la descripción de la imagen aquí

Luego debe cambiar el nombre, escribiendo la siguiente línea en una ventana de cmd:

 rename git.txt .gitignore

¿Dónde git.txtestá el nombre del archivo que acaba de crear?

Luego puede abrir el archivo y escribir todos los archivos que no desea agregar en el repositorio. 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
~$*

Una vez que tenga esto, debe agregarlo a su repositorio de Git. Tienes que guardar el archivo donde está tu repositorio.

Luego, en Git Bash, debe escribir la siguiente línea:

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

Si el repositorio ya existe, debe hacer lo siguiente:

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

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

SomeAnonymousPerson
fuente
Puede usar el comando "copy con .gitignore" en la solicitud y luego presionar CTRL + Z para crear directamente el archivo sin el Explorador de Windows.
heringer
61

Ignorar:

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

Para deshacer ignorar:

git update-index --no-assume-unchanged <path/to/file>
avj
fuente
66
Me gustaría que esto sea parte superior de la tabla como solución al problema .... Es muy simple y elegante
user1457958
"Es muy simple y elegante", en realidad no : "Supongamos que no se debe cambiar por un mecanismo de ignorar. Se trata de "yo sé mis operaciones del sistema de archivos son lentos. Voy a Git prometo que no voy a cambiar estas rutas ..." Sobre todo, es no una promesa ... que Git siempre tendrá en cuenta estos caminos son sin modificar, si Git puede determinar una ruta ... ha cambiado sin incurrir en un lstat(2)costo adicional , se reserva el derecho de informar que la ruta ha sido modificada (... git commit -aes libre de cometer ese cambio).
Chris
47

Puede utilizar los siguientes métodos para ignorar / no ignorar los cambios en los archivos rastreados.

  1. Por ignorar: git update-index --assume-unchanged <file>
  2. Para revertir archivos ignorados: git update-index --no-assume-unchanged <file>
kapillohakare
fuente
44
¿Se aplica eso a todos los archivos? No está claro cómo se pueden aplicar esos comandos a un solo archivo para ignorarlo / ignorarlo.
javadba
@kapil finalmente !! ¡algo que realmente funciona entre un billón de variaciones de comando git! Intenté cada respuesta para ignorar algunos estúpidos archivos build.xml que seguían apareciendo después de cada compilación ... ¡gracias!
killjoy
1
Por favor no : 'No se debe abusar de asumir sin cambios por un mecanismo de ignorar. Se trata de "yo sé mis operaciones del sistema de archivos son lentos. Voy a Git prometo que no voy a cambiar estas rutas ..." Sobre todo, es no una promesa ... que Git siempre tendrá en cuenta estos caminos son sin modificar, si Git puede determinar una ruta ... ha cambiado sin incurrir en un lstat(2)costo adicional , se reserva el derecho de informar que la ruta ha sido modificada (... git commit -aes libre de cometer ese cambio).
Chris
22

Cree un .gitignoreen el directorio donde está .git. Puede enumerar archivos separados por una nueva línea. También puedes usar comodines:

*.o
.*.swp
término
fuente
3
Es una buena práctica evitar colocar patrones específicos de herramientas (es decir, sus archivos Vim temporales) en .gitignorearchivos (a menos que el proyecto lo exija). Puede poner patrones para sus herramientas favoritas en su archivo de exclusión por usuario (conjunto core.excludesFile); funcionarán en todos sus repositorios. Por ejemplo git config --global core.excludesFile "$HOME/.git-user-excludes", luego póngalos en ese archivo.
Chris Johnsen
@ Chris: Gracias por el consejo. Pero lo acabo de escribir allí porque no se me ocurrió nada mejor :)
terminal
1
@ChrisJohnsen '¿herramienta específica?' para vim ?? creo que es seguro excluir archivos de intercambio vim ..
javadba
16

Desde el sitio oficial de GitHub:

Si ya tiene un archivo registrado y desea ignorarlo, Git no ignorará el archivo si agrega una regla más adelante. En esos casos, primero debe rastrear el archivo ejecutando el siguiente comando en su terminal:

git rm --cached FILENAME

o

git rm --cached .
Mile Mijatović
fuente
12

Deberías escribir algo como

*.class

en tu .gitignorearchivo.

KingCrunch
fuente
44
@AgentZebra Debe agregar una entrada *.classa su .gitignorepara hacer que git ignore todos los archivos que terminan en .class.
KingCrunch
7

Agregue qué archivos desea ignorar al archivo .gitignore:

*.clase

* .proyectos

* .prefs

*.proyecto

Chinmoy
fuente
5

Si ya ha confirmado el archivo e intenta ignorarlo agregando al .gitignorearchivo, Git no lo ignorará. Para eso, primero debes hacer lo siguiente:

git rm --cached FILENAME

Si está comenzando el proyecto recientemente y desea agregar algunos archivos a Git ignore, siga los pasos a continuación para crear un archivo Git ignore:

  1. Navega a tu repositorio de Git.
  2. Ingrese "touch .gitignore" que creará un .gitignorearchivo.
Savyasachi
fuente
3

También puede usar .gitattributes (en lugar de .gitignore) para excluir tipos de archivo completos. El archivo se explica por sí mismo, pero estoy pegando el contenido aquí como referencia. Presta atención a la última línea (* .class binary):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary
David Niki
fuente
2

Agregue la siguiente línea a .git / info / exclude:
Hello.class

Friso
fuente
¿Se supone que debes cambiar los archivos dentro de la carpeta .git?
Peter Mortensen
Tal vez, no sea una buena idea tocar esos archivos bajo .git manualmente.
mgyky
2

Esta página web puede ser útil y ahorrar tiempo al trabajar con .gitignore.

Genera automáticamente archivos .gitignore para diferentes IDEs y sistemas operativos con los archivos / carpetas específicos que generalmente no desea extraer a su repositorio Git (por ejemplo, carpetas específicas de IDE y archivos de configuración).

Jaime Caffarel
fuente
1

Intenté esto

  1. enumerar los archivos que queremos ignorar

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Copie el contenido del paso 1 y agréguelo al archivo .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Validar

git status .gitignore

Del mismo modo, podemos agregar el directorio y todos sus subdirectorios / archivos que queremos ignorar en estado git usando directoryname/*y ejecuté este comando desde el srcdirectorio.

VIPIN KUMAR
fuente
1
  1. Vaya al archivo .gitignore y agregue la entrada para los archivos que desea ignorar
  2. correr git rm -r --cached .
  3. Ahora corre git add .
Rahul Garg
fuente
0

He intentado el --assume-unchangedy también el .gitignorepero ninguno funcionó bien. Hacen que sea difícil cambiar de rama y que sea difícil fusionar los cambios de los demás. Esta es mi solución:

Cuando me comprometo , elimino manualmente los archivos de la lista de cambios

Antes de tirar , guardo los archivos modificados. Y después de tirar, hago un escondite .

  1. escondite
  2. git pull
  3. git stash pop

El paso 3 a veces desencadenará una fusión y puede generar conflictos que debe resolver, lo cual es algo bueno.

Esto me permite mantener cambios locales que no se comparten con otros miembros del equipo.

John Henckel
fuente