¿Por qué Git no ignora mi archivo especificado?

195

Agregué la siguiente línea a .gitignore:

sites/default/settings.php

pero cuando escribo git status, muestra el archivo como un archivo sin clasificar.

¿Cuál es el problema? Todos los demás patrones funcionan bien.

Nick.h
fuente
Tuve el mismo problema, luego descubrí que guardé mi archivo .gitignore en una unidad diferente: cara de palma:
Henry Chan
Es una muy mala idea mantener cosas en su repositorio e ignorar los cambios en él.
Yevgeniy Afanasyev

Respuestas:

370

Asegúrese de que .gitignoreestá en la raíz del directorio de trabajo, y en ese directorio ejecute git statusy copie la ruta al archivo desde la salida de estado y péguelo en el .gitignore.

Si eso no funciona, es probable que Git ya haya rastreado su archivo. Puede confirmar esto a través de la salida de git status. Si el archivo no figura en la sección "Archivos no rastreados", Git ya lo ha rastreado e ignorará la regla del .gitignorearchivo.

La razón para ignorar los archivos en Git es para que no se agreguen al repositorio. Si previamente agregó un archivo que desea ignorar, Git lo rastreará y se omitirán las reglas de ignorar que coincidan. Git hace esto ya que el archivo ya es parte del repositorio.

Para ignorar realmente el archivo, debe destrabarlo y eliminarlo del repositorio. Puedes hacerlo usando git rm --cached sites/default/settings.php. Esto elimina el archivo del repositorio sin eliminarlo físicamente (eso es lo que --cachedhace). Después de confirmar ese cambio, el archivo se eliminará del repositorio e ignorarlo debería funcionar correctamente.

dar un toque
fuente
¿Qué quiere decir con "raíz del directorio de trabajo"? ¿El directorio donde se encuentra el repositorio '.git'?
Jonathan Leffler
El directorio de trabajo es el directorio en el que .gitse encuentra el directorio y que es la raíz del repositorio. Como cuando clonas un repositorio, /xy/entonces /xy/es tu directorio de trabajo con /xy/.git/inside.
meter
3
A veces, también deberá hacer un git add .after git rm --cachedpara reconstruir correctamente el índice.
Cooper el
La idea de verificarlo en el estado de git fue brillante. Seguí revisándolo en el Git Staging en Eclipse y la ruta era incorrecta. ¡Gracias!
walla
1
Necesitaba agregar el indicador -r (recursivo) ya que también había registrado carpetas anidadas. En mi caso, me mudé a la raíz de mi carpeta git y luego ejecuté el comando git rm --cached -r .vs / Where vs fue la carpeta de nivel superior que quería eliminar del seguimiento.
Devology Ltd el
106

Me encuentro con esto, es una vieja pregunta, pero quiero que ese archivo sea rastreado pero no rastrearlo en ciertas copias de trabajo, para hacerlo puedes ejecutar

git update-index --assume-unchanged sites/default/settings.php
Mescalito
fuente
55
Esa es en realidad la respuesta que estaba buscando. Todas las demás respuestas suponen que el archivo se agregó con git add, que no siempre es el caso. Con Acquia Cloud, se supone que el archivo .gitignore ignora settings.php (por ejemplo), pero el archivo se incluye con el primer commit. Desentrañando el archivo, simplemente lo elimina del repositorio, por lo tanto, lo elimina del sitio en vivo ...
PatrickS
También me ayudó - ¡gracias! Votado Sospecho que aunque solo se aplica al repositorio local de git y no persistiría una vez que sea empujado a remoto y clonado por otros desarrolladores.
Ivan
1
Sí, es solo local.
Mescalito
41

.gitignore solo ignorará los archivos que aún no haya agregado a su repositorio.

Si hiciste un git add ., y el archivo se agregó al índice, .gitignore no te ayudará. Tendrá que hacer git rm sites/default/settings.phppara eliminarlo, y luego será ignorado.

jonescb
fuente
gracias.but ¿Cómo elimino el archivo solo del índice y no del directorio de trabajo?
Nick.h
1
git rmdebería hacerlo, pero es posible que le pida que use la opción -f que lo eliminaría del directorio de trabajo. No he descubierto esto más que hacer una copia del archivo, hacer git rm -fy luego restaurar la copia.
jonescb
Mismo hombre. Haga una copia en alguna parte, elimínela, confirme el estado eliminado, vuelva a agregar los archivos y vea cómo se ignoran ahora.
Yevgeniy Afanasyev
18

Por favor use este comando

git rm -rf --cached .
git add .

A veces, los archivos .gitignore no funcionan aunque sean correctos. La razón por la que Git ignora los archivos es que no se agregan al repositorio. Si agregó un archivo que desea ignorar antes, Git lo rastreará y se omitirá cualquier regla de omisión. Git hace esto porque el archivo ya es parte del repositorio.

LiQiang
fuente
12

Yo tuve el mismo problema. Los archivos definidos en .gitingoredonde se enumeran como archivos sin seguimiento cuando se ejecutan git status.

La razón fue que el .gitignorearchivo se guardó en UTF-16LEcodificación y no en UTF8codificación.

Después de cambiar la codificación del .gitignorearchivo UTF8, funcionó para mí.

Floris Devreese
fuente
Me siento como un novato debido a esto ... dang Windows
Coty Embry
¿Alguna idea de por qué es importante la codificación del archivo? Tal vez no leer la ruta correctamente?
Chargnn
2

Lo que hice para ignorar el archivo settings.php con éxito:

  1. git rm - sitios en caché / default / settings.php
  2. cometer (hasta aquí no funcionó)
  3. sitios eliminados manualmente / default / settings.php (esto hizo el truco)
  4. git add.
  5. commit (ignorado con éxito)

Creo que si hay un archivo comprometido en Git, ignorar no funciona como se esperaba. Simplemente elimine el archivo y confirme. Luego lo ignorará.

Alper Ebicoglu
fuente
2

Hay instancias, por ejemplo, archivos de configuración de aplicaciones, que quiero rastrear en git (por lo que .gitignore no funcionará), pero que necesito cambiar para la configuración local. No quiero que git administre estos archivos o los muestre como modificados. Para hacer esto uso skip-worktree:

git update-index --skip-worktree path/to/file

Puede confirmar que los archivos se omiten enumerando archivos y buscando líneas que comiencen con S para omitidos

git ls-files -v | grep ^S

Si en el futuro desea que git administre el archivo localmente nuevamente, simplemente ejecute:

 git update-index --no-skip-worktree path/to/file

Mescalito arriba tuvo una gran respuesta, eso me llevó por el camino correcto pero

git update-index: archivo sin suponer / a / ignore.php

Tiene un contrato con git en el que: el usuario promete no cambiar el archivo y le permite a Git suponer que el archivo del árbol de trabajo coincide con lo que está registrado en el índice.

Sin embargo, cambio el contenido de los archivos, así que en mi caso --skip-worktree es la mejor opción.

El sitio web de Toshiharu Nishina proporcionó una excelente explicación de skip-worktree vs asumir-sin cambios: Ignorar archivos ya administrados con Git localmente

J.Leupp
fuente
2

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


Esto me sucedió, estaba usando "GitHub Desktop" como el cliente principal y estaba ignorando 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 git cache; compruebe si .gitignore es UTF8; eliminar archivos -> confirmar -> mover archivos hacia atrás; omitir 1 commit: nada ayudó.

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

Solución : vuelva a verificar múltiples clientes git ocultos y use solo un cliente git a la vez, especialmente al borrar la memoria caché git.

Oleg Zarevennyi
fuente
1

¡Asegúrate de que el .gitignore no tenga una extensión! No puede ser .gitignore.txt, en Windows simplemente nombra el archivo .gitignore. y funcionará

ZackOfAllTrades
fuente
0

Acabo de probar esto con git 1.7.3.1, y me dio una estructura como:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

donde repoestá la "raíz" mencionada anteriormente (yo la llamaría la raíz de su árbol de trabajo), y .gitignoresolo contiene sites/default/settings.php, ignorar funciona para mí (y no importa si .gitignorese agrega al repositorio o no). ¿Esto coincide con su diseño de repositorio? Si no, ¿qué difiere?

Johan
fuente
Sí, es exactamente el mismo que el tuyo. Pero no funciona. Todos los demás patrones funcionan. Como dije, el problema seguramente es relativo a la carpeta settings.php.
Nick.h
Siento que es una muy mala idea mantener cosas en su repositorio e ignorar los cambios en él.
Yevgeniy Afanasyev
@YevgeniyAfanasyev, excepto por cosas como salida de compilación, configuración de usuario IDE, todos los demás archivos temporales generados por su cadena de herramientas ...
Chris F Carroll
Me refería a mantenerme comprometido en el repositorio, no solo en los archivos que se encuentran en la carpeta del proyecto. ¿Por qué necesitarías archivos temporales en el repositorio?
Yevgeniy Afanasyev
0

Por si alguien en el futuro tiene el mismo problema que yo:

Si usas el

*
!/**/
!*.*

truco para eliminar archivos binarios sin extensión, asegúrese de que TODAS las demás líneas de gitignore estén ABAJO. Git leerá desde .gitignore desde la parte superior, por lo que a pesar de que tenía 'test.go' en mi gitignore, fue el primero en el archivo y se convirtió en 'no ignorado' después

!*.*
Alasdair Mclean
fuente
0

Intenté la mayoría de los comandos anteriores en el terminal VS Code y obtuve errores como:

fatal: pathspec '[dir]/[file]' did not match any files

Abrí el proyecto en GitHub Desktop e ignoré desde allí y funcionó.

Danna Capellan
fuente