.gitignore es ignorado por Git

1514

Mi .gitignorearchivo parece estar siendo ignorado por Git, ¿podría .gitignoreestar dañado? ¿Qué formato de archivo, configuración regional o cultura espera Git?

Mi .gitignore:

# This is a comment
debug.log
nbproject/

Salida de git status:

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       debug.log
#       nbproject/
nothing added to commit but untracked files present (use "git add" to track)

Me gustaría debug.logy nbproject/no aparecer en la lista de archivos sin seguimiento.

¿Dónde debería comenzar a buscar para solucionar esto?

Matt Parkins
fuente
56
Asegúrese de que su .gitignorearchivo use ANSIo UTF-8codifique. Si usa algo como Unicode BOM, es posible que Git no pueda leer el archivo.
ADTC
8
@ADTC este fue exactamente el problema en mi máquina (Windows). Lo he usado echo "file" > .gitignoreen PowerShell, ¡el archivo tenía una codificación UCS-2!
MarioDS
77
git rm --cached debug.log nbproject/
Gayan Weerakutti
44
Por eso el primer comentario aquí no es una respuesta está más allá de mí
RedOrav
2
@MattParkins Ah, ahora lo veo, todavía me sorprende que una respuesta tan simple y precisa esté enterrada como un comentario o que la respuesta real aceptada esté ahí abajo. ¡Gracias!
RedOrav

Respuestas:

3122

Incluso si no ha rastreado los archivos hasta ahora, Git parece ser capaz de "saber" sobre ellos incluso después de agregarlos .gitignore.

ADVERTENCIA: Primero confirme sus cambios actuales, o los perderá.

Luego ejecute los siguientes comandos desde la carpeta superior de su repositorio Git:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"
Alin Huruba
fuente
8
Obtuve "uso: git rm [opciones] [-] <file> ..." impreso cuando intenté "git rm -r --cached". Si es importante, estoy usando Git desde PowerShell después de hacer clic en "Herramientas-> Abrir un shell aquí" en GitHub para Windows.
Pronto
61
en Windows: git rm. -r - en caché y git add.
Beachhouse
90
¡Tenga en cuenta que debe confirmar todos sus cambios antes, de lo contrario perderá el control de todos los archivos modificados!
Cosmin
45
Los primeros 3 comentaristas parecen haber perdido el punto al final. Esto significa cada archivo. "git -rm -r --cached". <- nota el punto.
Christophe De Troyer
18
Si no desea comprometerse, una solución es colocar sus cambios en el estante: "git stash". Ejecute los comandos anteriores. y ejecutar "git stash pop"
Ivan Voroshilin
335

Si parece que Git no se da cuenta de los cambios que realizó en su .gitignorearchivo, es posible que desee verificar los siguientes puntos:

  • Puede haber un .gitignorearchivo global que pueda interferir con el local.
  • Cuando agrega algo en un archivo .gitignore, intente esto:

    git add [uncommitted changes you want to keep] && git commit
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"
    
  • Si elimina algo de un archivo .gitignore, y los pasos anteriores tal vez no funcionen, si descubrió que los pasos anteriores no funcionan, intente esto :

    git add -f [files you want to track again]
    git commit -m "Refresh removing files from .gitignore file."
    
    // For example, if you want the .java type file to be tracked again,
    // The command should be:
    //     git add -f *.java
    
ifeegoo
fuente
3
¿Quizás podría editar la respuesta de @AlinHuruba para agregar su paso 3?
Benj
@Benj Gracias por tu consejo, no encontré la respuesta de AlinHuruba, no sabía cuál era la diferencia, así que dímelo directamente.
ifeegoo
2
El paso 3 es lo que necesitaba. La mayor parte de la respuesta solo dice cómo eliminar el archivo que queremos rastrear. Gracias por el punto de vista opuesto.
Yeung
¡Espero que esto te ayude!
ifeegoo
77
git rm -r --cached .funcionó para mí
Jason
198

Fijo. OK, creé el archivo .gitignore en el Bloc de notas en Windows y no funcionaba. Cuando vi el archivo .gitignore en Linux, parecía un galimatías organizado: tal vez el Bloc de notas había escrito Unicode en lugar de ASCII o lo que sea de 8 bits.

Así que reescribí el archivo en mi caja de Linux, y cuando lo recuperé en Windows, ¡funciona bien! ¡Hurra!

Matt Parkins
fuente
77
En el Bloc de notas, simplemente elija la codificación "ANSI" en el cuadro de diálogo "Guardar como". O mejor aún, obtenga un editor de texto adecuado; después de todo, usted es un programador :) ... Puedo recomendar el "Bloc de notas del programador", otros prefieren Notepad ++ y hay literalmente cientos más.
0xC0000022L
1
jeje, sí, debería haberlo creado en netbeans (que estaba usando en ese momento), eclipse o estudio visual. Lo llamé desde la línea de comandos pensando que no haría la diferencia.
Matt Parkins
8
Mi problema era similar: mi .gitignore estaba usando UTF8 con una lista de materiales . Simplemente lo guardé como UTF8 sin una lista de materiales y mágicamente comenzó a funcionar.
Phil
13
Este fue mi problema también. Creé el archivo .gitignore con "echo dirName> .gitignore" porque Windows dificulta crear archivos que comienzan con ".". La codificación del archivo creado de esta manera era ilegible por git, y en su lugar lo interpretó como un archivo binario. Hizo clic en "Codificación -> UTF-8" en Notepad ++, guardar, listo.
Laura
44
Tuve el mismo problema que @Laura en powershell: el archivo se guarda por defecto como UTF16.
mrówa
113

Sin agregar otro compromiso a su proyecto, una línea será suficiente para que .gitignorefuncione como se supone que debe:

git rm -r --cached debug.log nbproject

Esto los eliminará del repositorio, pero los mantendrá físicamente. En inglés simple, elimina cualquier historial de cambios relacionados con ellos, y tampoco realizará un seguimiento de su cambio en ninguna confirmación futura. Puede encontrar una mejor explicación aquí .

H Aßdøµ
fuente
1
Funcionó exactamente como quería: solo tenía 1 archivo que no se rastreó correctamente. Guardé su contenido en el bloc de notas, y lo hice: git rm -r --cached someFile.phpy funcionó a las
mil maravillas
@FMFF Esto lo eliminará del repositorio pero aún los mantendrá físicamente, en inglés simple, elimina cualquier historial de cambios relacionados con ellos, y tampoco hará un seguimiento de su cambio en ningún compromiso futuro. Una mejor explicación que puede encontrar aquí: stackoverflow.com/questions/37279654/…
H Aßdøµ
Obtuve un error "fatal: pathpec 'debug.log' no coincidía con ningún archivo"
Michael
45

Otra causa de este problema son los espacios en blanco o las pestañas antes de la declaración:

Ejemplo:

# Be aware of the following:
 notWorkingIgnore.*
workingIgnore.*

Y como lo señala el comentario a continuación, un espacio final también puede ser un problema:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace
Rawa
fuente
11
El problema era un espacio final, que es aún más difícil de encontrar.
amr
3
también tenía un problema de espacio en blanco al final.
Trefex
3
Sí, lo mismo aquí. Pensé que podría escribir comentarios después el patrón de archivo: *.txt # Tex files. Pero git entiende: "Ignora los archivos con la extensión txt "
Adam Libuša
3
Mi palabra, me llevó 2 días encontrar esta respuesta de 15 votos. Esto merece más.
Fordcars
2
Acabas de resolver un problema que tuve durante meses ... ¡Gracias!
Arkellys
36

Me di cuenta de que la codificación de la .gitignore estaba teniendo un efecto: si el archivo era Unicode, se ignoraba, si era ASCII, no lo era.

Proceso:

  1. Verificar estado: PS> git status
  2. Crea una función para Get-FileEncoding
  3. Prueba .gitignorede codificación:PS> Get-FileEncoding .gitignore
  4. Cambia la codificación a ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. Confirmar: PS> git status
craig
fuente
55
1000 gracias por esto. Estaba creando el archivo .gitignore en mi sistema usando la ruta touch .gitignorey echo ".db" >> .gitignorea través de powershell. Descubrí que echo ".db" >> .gitignore"estaba configurando la codificación del archivo a UCS-2 LE-BOM, una conversión rápida a ASCII y el gitignore comenzó a funcionar.
B-Rad
2
Puede intentar omitiendo los pasos 2 y 3.
Aniket Bhansali
32

Al igual que con las otras soluciones, comprometerse primero y ser consciente de que va a perder cualquier cambio un-comprometidos.

Tuve mejores resultados con esto:

git rm -r --cached .
git reset HEAD --hard
git status

Tenga en cuenta que el estado no debería tener ningún archivo modificado ahora.

Steven Stark
fuente
2
este no me funciona, pero la respuesta de ifeegoo sí
fanny
21

En mi caso, es porque los archivos ya existen en el repositorio y estoy tratando de ignorarlo.

Estas son las cosas que hice para solucionar el problema:

  • Copie los archivos a una carpeta temporal
  • Eliminarlos de mi carpeta de proyecto.
  • Confirmar los cambios que eliminan esos archivos del repositorio
  • Vuelva a agregar esos archivos a mi carpeta de proyecto

Para entonces, cualquier cambio que hice en esos archivos fue ignorado.

Creo que no puede ignorar los archivos que ya existen en el repositorio.

Edesa
fuente
En mi caso, ya estaban representados. Solo después de hacer lo que sugieres, luego de intentar cometer y ver la advertencia de que habían sido organizados y eliminados, me di cuenta de que ese era el problema.
dudeNumber4
19

Todas las respuestas aquí son en realidad soluciones alternativas. Debe crear el archivo .gitignore antes de ejecutarlo git init. De gitlo contrario , nunca sabrá que debe ignorar esos archivos, porque ya han sido rastreados.

echo .idea/ >> .gitignore
git init

Si se desarrolla a diario, le aconsejo que agregue sus archivos habituales ignorados a su ~/.gitignore_globalarchivo. De esa manera, gitya sabrá qué archivos (generalmente significa "su usuario", ya que es un archivo en su directorio personal) generalmente ignora.

CESCO
fuente
Gracias a Dios ... finalmente una solución que funciona para mí.
Dbl
~/.gitignore_globales un nombre configurable Ejecute git config --global core.excludesfileprimero para ver si ya tiene un archivo definido. Si no, corre git config --global core.excludesfile ~/.gitignore_global.
Noumenon
Una solución alternativa si no creó .gitignoreprimero: cambie el nombre del archivo rastreado. .gitignorese aplicará como si fuera nuevo.
Noumenon
15

También mira el directorio donde pones.gitignore .

Debe estar en la raíz de su proyecto :

./myproject/.gitignore

No en

./myproject/.git/.gitignore
Artem Zaytsev
fuente
9

Específicamente para usuarios de Windows: si tiene archivos sin seguimiento y borrar / eliminar los archivos en caché no funciona. Intente abrir PowerShell y convertir el archivo .gitignore a la codificación UTF-8:

$Myfile = Get-Content .\.gitignore`
$Myfile | Out-File -Encoding "UTF8" .gitignore

Solo necesita hacer esto una vez para codificar el archivo .gitignore para ese directorio, y dado que el archivo se codifica correctamente, cada vez que edite el archivo en el futuro debería funcionar. Creo que esto se debe a una falla con GitHub que no está a punto de leer la codificación no UTF-8 para un archivo .gitignore. Hasta donde sé, este problema aún no se ha resuelto para Windows. No es un gran problema, solo un dolor de depuración cuando no está funcionando.

maximusg
fuente
8

Hay otro problema con .gitignoreeso que puede suceder, especialmente para un usuario de Windows. A Git no le gusta cuando lo nombras .gitignore(como unity.gitignore).

Siempre querrá nombrarlo .gitignore, o en Windows, .gitignore.ya que Windows cree que está tratando de cambiarle el nombre sin un nombre de archivo.

Goldblaze
fuente
7

Acabo de encontrarme con este problema. El contenido dentro de mi archivo .gitignore continuó apareciendo en la lista de archivos sin seguimiento.

Estaba usando esto para crear el archivo de ignorar:

echo "node_modules" > .gitignore

Resulta que las comillas dobles me estaban causando el problema. Eliminé el archivo de ignorar y luego usé el comando nuevamente sin comillas, y funcionó como se esperaba. No tuve que meterme con la codificación del archivo. Estoy en una máquina con Windows 10 usando Cmder .

Ejemplo:

echo node_modules > .gitignore
bprdev
fuente
Extraño, esta declaración de eco solucionó un problema que tenía localmente cuando un archivo ignorado que eliminé por accidente y luego recreé se mostraba como un archivo comprometible y sin seguimiento. Por alguna razón, aunque esto no cambió mi archivo de ignorar, solucionó mi problema.
Patrick
6

Para mí ninguna de las respuestas anteriores funcionó. Tuve que copiar .gitignoretexto en el exclude.txtarchivo encontrado en

<Your-project-folder>\.git\info

Una vez hecho esto, actualice sus cambios y todos los archivos no rastreados desaparecerán. Comprométete como siempre.

raga
fuente
6

Mi problema fue (como OP sugirió) un archivo corrupto .gitignore. No creía que así fuera e ignoré la posibilidad hasta que todo lo demás falló. La corrupción no aparecióvi , pero había dos bytes al comienzo del archivo que hicieron que se ignorara el archivo .gitignore. Para mí, estos solo aparecieron cuando escribí cat .gitignore, lo que mostró:

��# Built application files
*.apk
*.ap_

# ...

No tengo idea de cómo terminaron allí, pero volver a crear el archivo solucionó el problema. Un análisis hexadecimal del archivo dañado mostró lo siguiente:

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.
pcdev
fuente
2
Parece una marca de orden de bytes UTF-16 en un archivo codificado en UTF-8. en.wikipedia.org/wiki/Byte_order_mark
jsageryd
6

Tuve este problema, con un archivo .gitignore que contiene esta línea:

lib/ext/

Me acabo de dar cuenta de que, de hecho, este directorio es un enlace simbólico a una carpeta en otro lugar:

ls -la lib/ext/
lrwxr-xr-x 1 roipoussiere users 47 Feb  6 14:16 lib/ext -> /home/roipoussiere/real/path/to/the/lib

En la línea lib/ext/, Git realmente busca una carpeta , pero un enlace simbólico es un archivo , así que milib carpeta no se ignora.

Lo arreglé reemplazándolo lib/ext/por lib/exten mi archivo .gitignore.

roipoussiere
fuente
5

Yo tuve el mísmo problema. Creo que el problema era una discrepancia CR vs. CR + LF. Guardé cosas en mi .gitignore usando CMD (en Windows 7) y el siguiente comando:

Malo:

echo "file_to_be_ignored.py" >> .gitignore<br>
echo "*~" >> .gitignore

Etc.

El problema era que este comando no coloca el marcador de fin de línea correcto para que Git reconozca las nuevas líneas (CR o CR + LF cuando Git espera el otro). Resolví el problema reemplazando manualmente cada nueva línea en Vim (¡Vim al rescate!) Y funcionó perfectamente.

Intente editar su .gitignore en Notepad ++ o Vim (idealmente). Incluso si el archivo parece estar formateado correctamente, intente reemplazar las nuevas líneas. Suena raro, lo sé, pero funcionó para mí. :RE

lógica ficticia
fuente
3

Una cosa a tener en cuenta también: ¿está guardando su archivo .gitignore con las terminaciones de línea correctas?

Ventanas:

Si lo está utilizando en Windows, ¿lo está guardando con los finales de línea de Windows? No todos los programas harán esto por defecto; Notepad ++ y muchos editores PHP predeterminan las terminaciones de línea de Linux para que los archivos sean compatibles con el servidor. Una manera fácil de verificar esto es abrir el archivo en el Bloc de notas de Windows. Si todo aparece en una línea, el archivo se guardó con finales de línea de Linux.

Linux:

Si tiene problemas con el archivo que funciona en un entorno Linux, abra el archivo en un editor como Emacs o nano . Si ve caracteres no imprimibles, el archivo se guardó con finales de línea de Windows.

Casa en la playa
fuente
3

Otra posible razón : algunas instancias de clientes Git ejecutándose al mismo tiempo . Por ejemplo, "git shell" + "GitHub Desktop", etc.


Esto me paso a mi. Estaba usando "GitHub Desktop" como el cliente principal, e ignoraba algunas configuraciones nuevas de .gitignore: commit after commit:

  1. Cometes algo.
  2. A continuación, commit: ignora la configuración de .gitignore. Commit incluye muchos archivos temporales mencionados en .gitignore.
  3. Borrar caché de Git; compruebe si .gitignore es UTF-8; eliminar archivos → confirmar → mover archivos hacia atrás; omita una confirmación, nada ayudó.

Motivo : el editor de Visual Studio Code se estaba ejecutando en segundo plano con el mismo repositorio abierto. Visual Studio Code tiene control Git incorporado, y esto crea algunos conflictos.

Solución : verifique dos clientes Git múltiples y ocultos y use solo un cliente Git a la vez, especialmente al borrar la caché de Git.

Oleg Zarevennyi
fuente
3

Ya hay algunas respuestas geniales, pero mi situación era tediosa. Edité la fuente de un software PLM (gestión del ciclo de vida del producto) instalado en Win10 y luego decidí: "Probablemente debería haber hecho de esto un repositorio git".

Entonces, la opción de caché no funcionará para mí, directamente. Publicar para otros que pueden haber agregado control de fuente DESPUÉS de hacer un montón de trabajo inicial Y .gitignoreno funciona PERO, es posible que tengas miedo de perder un montón de trabajo, así git rm --cachedque no es para ti.

!IMPORTANTE: Esto es realmente porque agregué git demasiado tarde a un "proyecto" que es demasiado grande y parece ignorar mi .gitignore. No me comprometo, nunca. Puedo irme con esto :)

Primero, acabo de hacer:

rm -rf .git
rm -rf .gitignore

Entonces, tuve que tener una foto de mis cambios. Nuevamente, este es un producto de instalación en el que he realizado cambios. Demasiado tarde para un primer compromiso de rama maestra pura. Entonces, necesitaba una lista de lo que cambié desde que instalé el programa agregando > changed.loga cualquiera de los siguientes:

Potencia Shell

# Get files modified since date.
Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName

Golpetazo

# Get files modified in the last 10 days...
find ./ -type f -mtime -10

Ahora, tengo mi lista de lo que cambié en los últimos diez días (no entremos en las mejores prácticas aquí aparte de decir, sí, me hice esto a mí mismo).

Para un nuevo comienzo, ahora:

git init .
# Create and edit .gitignore

Tuve que comparar mi lista cambiada con mi creciente .gitignore, corriendo git status medida que la mejoraba, pero mis ediciones en .gitignore se leen a medida que avanzo.

¡Finalmente, tengo la lista de cambios deseados! En mi caso, es repetitivo: algunos temas funcionan junto con las configuraciones de servidor xml específicas para ejecutar un sistema de desarrollo contra este software que quiero poner en un repositorio para que otros desarrolladores obtengan y contribuyan ... Esta será nuestra rama maestra, así que comprometiéndose, empujando y, finalmente, RAMIFICANDO para un nuevo trabajo!

Neil Guy Lindberg
fuente
2

Simplemente elimine la carpeta o el archivo, que se confirmó previamente en Git, mediante el siguiente comando. Entonces el archivo gitignore reflejará los archivos correctos.

    git rm -r -f "folder or files insides"
Atif Hussain
fuente
2

Una cosa difícil que no está cubierta por las otras respuestas aquí es que el archivo .gitignore no funcionará si tiene comentarios en línea, como este:

foo/bar # The bar file contains sensitive data so we don't want to make this public

Entonces, si tiene comentarios como ese, cámbielos así:

# The bar file contains sensitive data so we don't want to make this public
foo/bar
James
fuente
2

También es posible que haya editado el .gitignorearchivo con un sudocomando. Encontré el mismo problema y al ejecutar los comandos:git status aún podía ver los archivos "deberían ignorarse".

Al editar con en nano .gitignorelugar de sudo nano .gitignore, pude ver el reflejo correcto.

aviral sanjay
fuente
2

He creado .gitignore usando echo "..." > .gitignorePowerShell en Windows, porque no me permite crearlo en el Explorador de Windows.

El problema en mi caso fue la codificación del archivo creado, y el problema se resolvió después de que lo cambié a ANSI.

Ahmad
fuente
2

Yo también tengo el mismo problema en Ubuntu, lo creé .gitignoredesde el terminal y me funciona

touch .gitignore

UA_
fuente
2

El mío no funcionaba porque literalmente creé un documento de texto llamado .gitignore

En su lugar, cree un documento de texto, ábralo en Notepad ++ y guárdelo como .gitignore

Asegúrese de elegir Todos los tipos (*. *) Del menú desplegable cuando lo guarde.


O en gitbash, simplemente use touch .gitignore

Kari
fuente
1

Si es usuario de Notepad ++ , intente hacer lo siguiente:

Abra su archivo .gitignore usando Notepad ++ y haga:

Menú EditarConversión EOLFormato de WindowsGuardar .

Intente usar git statusnuevamente y vea si funciona para usted.

He publicado la respuesta a una pregunta similar aquí .

Ozesh
fuente
1

Para mí fue otro problema más. Mi archivo .gitignore está configurado para ignorar todo, excepto las cosas que le digo que no ignore. Como tal:

/*
!/content/

Ahora esto obviamente significa que también le estoy diciendo a Git que ignore el archivo .gitignore en sí. Lo cual no fue un problema, siempre y cuando no estuviera rastreando el archivo .gitignore. Pero en algún momento cometí el archivo .gitignore en sí. Esto llevó a que el archivo .gitignore se ignorara correctamente.

Entonces, agregar una línea más lo arregló:

/*
!/content/
!.gitignore
usuario8118328
fuente
1

Mi problema fue que escribí los archivos para ignorarlos con comillas "" y no con la barra diagonal.

Esto no funcionó y fue ignorado por git:

"db.sqlite3"
"tdd_venv/"

Esto funcionó bien:

/db.sqlite3
/tdd_venv/

También verifiqué mi codificación de archivos en Windows con Notepad ++. La codificación se estableció en UTF-8.

JSalys
fuente