¿Cómo configuro git para ignorar algunos archivos localmente?

1351

¿Puedo ignorar archivos localmente sin contaminar la configuración global de git para todos los demás? Tengo archivos sin seguimiento que son spam en mi estado de git, pero no quiero confirmar los cambios de configuración de git para cada pequeño archivo aleatorio sin seguimiento que tengo en mis sucursales locales.

Bjorn
fuente

Respuestas:

1864

De la documentación relevante de Git :

Los patrones que son específicos de un repositorio particular pero que no necesitan ser compartidos con otros repositorios relacionados (por ejemplo, archivos auxiliares que viven dentro del repositorio pero son específicos del flujo de trabajo de un usuario) deben ir al $GIT_DIR/info/excludearchivo.

El .git/info/excludearchivo tiene el mismo formato que cualquier .gitignorearchivo. Otra opción es establecer core.excludesFileel nombre de un archivo que contiene patrones globales.

Tenga en cuenta que si ya tiene cambios sin clasificar, debe ejecutar lo siguiente después de editar sus patrones de ignorar:

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

Nota sobre$GIT_DIR : Esta es una notación utilizada en todo el manual de git simplemente para indicar la ruta al repositorio de git. Si se establece la variable de entorno, anulará la ubicación del repositorio en el que se encuentre, lo que probablemente no sea lo que desea.


Editar : Otra forma es usar:

git update-index --skip-worktree <file-list>

Invertirlo por:

git update-index --no-skip-worktree <file-list>
Josh Lee
fuente
204204
Como nota, asegúrese de ejecutar git update-index --assume-unchanged [<file>...]después de hacer la adición al archivo de exclusión. Los cambios no se recogerán hasta entonces.
tollmanz
30
No necesitaba ejecutar 'git update-index ...' para que los cambios surtan efecto usando git 1.7.9.5.
Jeffrey Martinez
39
Solo necesita usar git update-index si ya ha realizado un cambio en el archivo y ahora desea que se ignore. Si cambia excluir antes de realizar el cambio, no es necesario.
Brady Emerson
13
Si bien esto evita que el archivo aparezca como cambiado durante las confirmaciones como .gitignore, a diferencia de los archivos ignorados, los archivos aún se restablecerán a la versión de repositorio si ejecuta git reset --hard.
Brady Emerson
19
Por stackoverflow.com/questions/23097368/… y stackoverflow.com/questions/13630849/… , skip-worktreeprobablemente sería preferible assume-unchanged.
danShumway
436

Actualización : considere usar en su git update-index --skip-worktree [<file>...]lugar, ¡gracias @danShumway! Vea la explicación de Borealid sobre la diferencia de las dos opciones .


Vieja respuesta:

Si necesita ignorar los cambios locales en los archivos rastreados (lo tenemos con modificaciones locales en los archivos de configuración), use git update-index --assume-unchanged [<file>...].

Florian Sesser
fuente
8
Solo para tener en cuenta, agregué un archivo a $ GIT_DIR / info / exclude (por ejemplo, my-file.php) y luego tuve que ejecutarlo git update-index --assume-unchanged my-file.phppara comenzar a ser ignorado. ¡Gracias por el consejo!
tollmanz
78
Para deshacerlo: git update-index --no-assume-unchanged my-file.php
Ray
18
Solo para aclarar: asumir-sin cambios es para archivos rastreados (existe en el repositorio) ... OP estaba pidiendo archivos no rastreados, en cuyo caso .git/info/excludees lo que desea (para evitar contaminar el .gitignore a menudo compartido y rastreado)
dyodji
77
De acuerdo con stackoverflow.com/questions/23097368/… esto se considera inseguro, y sus archivos aún pueden confirmarse si no tiene cuidado. Pretende ser una ayuda para el rendimiento, no una solución infalible para este problema.
danShumway
3
Me apresuré --assume-unchangedantes de leer tu actualización . Me deshice --no-assume-unchangedy luego hice --skip-worktree... ¿Estoy en el claro?
Nicolas Miari
162

Agregue las siguientes líneas a la sección [alias] de su archivo .gitconfig

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Ahora puede usar git ignore my_filepara ignorar los cambios en el archivo local y git unignore my_filedejar de ignorarlos.git ignoredenumera los archivos ignorados.

Esta respuesta se obtuvo de http://gitready.com/intermediate/2009/02/18/tempomporary-ignoring-files.html .

phatmann
fuente
1
"! git ls-files -v | grep" ^ [[: lower:]] "- ¿Hay alguna posibilidad de que sepas cómo hacer esto en Windows cmd?
Haohmaru
3
Instale un shell real (por ejemplo, Babun proporciona bash o zsh);) Conozco sus sentimientos, pero recientemente cambié de Windows a Linux y nunca volvería a usar cmd.
Xerus
@Haohmaru, siempre puedes usar WSL (Subsistema de Windows para Linux).
Un Sz
110

Tienes varias opciones:

  • Deje un .gitignorearchivo sucio (o no confirmado) en su directorio de trabajo (o aplíquelo automáticamente usando topgit o alguna otra herramienta de parche).
  • Ponga las exclusiones en su $GIT_DIR/info/excludearchivo, si esto es específico de un árbol.
  • Ejecuta git config --global core.excludesfile ~/.gitignorey agrega patrones a tu ~/.gitignore. Esta opción se aplica si desea ignorar ciertos patrones en todos los árboles. Lo uso para .pycy .pyoarchivos, por ejemplo.

Además, asegúrese de utilizar patrones y no enumerar archivos explícitamente, cuando corresponda.

Emil Sit
fuente
10
Creo que necesitas git config --globalconfigurar la opción globalmente.
Josh Lee el
77
En realidad, solo agregue .gitignore a .gitignore;)!
Dominik George
68

Creo que estás buscando:

git update-index --skip-worktree FILENAME

que ignoran los cambios hechos locales

Aquí está http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ ¡ más explicaciones sobre estas soluciones!

para deshacer el uso:

git update-index --no-skip-worktree FILENAME
Piotr Korlaga
fuente
99
Hay una discusión relevante entre --skip-worktreey --assume-unchangeden esta pregunta SO
Merwer
1
¿Cómo podría deshacer esto, o ver la lista de archivos / patrones que actualmente se ignoran a través de --skipworktree, debería cambiar de opinión más adelante y desear comenzar a rastrear el archivo nuevamente?
Anomalía
1
¿Cómo deshacer esto?
user1735921
3
Para deshacer, utilicegit update-index --no-skip-worktree <file>
user1735921
49

Puede instalar algunos alias git para simplificar este proceso. Esto edita el [alias]nodo de su .gitconfigarchivo.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Los atajos que esto instala para usted son los siguientes:

  • git ignore config.xml
    • git fingirá que no ve ningún cambio config.xml, evitando que cometa accidentalmente esos cambios.
  • git unignore config.xml
    • git reanudará el reconocimiento de sus cambios config.xml, lo que le permitirá nuevamente confirmar esos cambios.
  • git ignored
    • git enumerará todos los archivos que está "ignorando" de la manera descrita anteriormente.

Los construí haciendo referencia a la respuesta de phatmann, que presenta una --assume-unchangedversión de la misma.

La versión que presento utiliza --skip-worktreepara ignorar los cambios locales. Ver la respuesta de Borealid para obtener una explicación completa de la diferencia, pero --skip-worktreeel propósito fundamental es que los desarrolladores cambien los archivos sin el riesgo de cometer sus cambios. .

El git ignoredcomando presentado aquí usa git ls-files -vy filtra la lista para mostrar solo aquellas entradas que comienzan con la Setiqueta. La Setiqueta denota un archivo cuyo estado es "omitir el árbol de trabajo". Para obtener una lista completa de los estados de los archivos que se muestran en git ls-files: consulte la documentación de la -topción en git ls-files.

Birchlabs
fuente
1
Esto no funciona para archivos sin seguimiento: <(git 2.13.5 en osx)
Terra Ashley
Es el '!' se supone que debe estar '!git ls-files -v | grep "^S"'? El comando no funciona para mí con él allí ... y parece funcionar bien con él eliminado.
Tiris
el signo de exclamación en un alias de git le dice a git que ejecute un comando externo , en lugar de un subcomando git . Lo puse porque necesito una tubería de shell, por lo que necesito invocar git desde afuera. Acabo de intentar eliminar el signo de exclamación (según su recomendación), pero eso no funciona para mí. Consigo Expansion of alias 'ignored' failed; 'git' is not a git command. Esto tiene sentido; sin el signo de exclamación: git alias tu comando git git ls-files ….
Birchlabs el
Gracias por la explicación. No estoy familiarizado con el alias de git y solo estaba ejecutando en un shell para probar antes de hacer el alias.
Tiris
Esta es una solución brillante. Dado que git rastrea por directorio, cuando ejecuta el alias anterior git ignore <filename>, solo se aplica a ese directorio. Y cuando finalmente desee realizar sus cambios en ese archivo y confirmar y enviar al control remoto, ¡solo use el práctico git unignore <filename>para comenzar a rastrearlo temporalmente de nuevo! ¡Gracias!
nickang
42

Simplemente puede agregar un archivo .gitignore a su directorio de inicio, es decir, $HOME/.gitignoreo ~/.gitignore. Luego dile a git que use ese archivo con el comando:

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

Este es un archivo normal .gitignore al que git hace referencia al decidir qué ignorar. Como está en su directorio de inicio, se aplica solo a usted y no contamina ningún archivo de proyecto .gitignore.

He estado usando este enfoque durante años con excelentes resultados.

JESii
fuente
Gracias, @EricChen. He actualizado la respuesta; pruébelo y luego úselo git check-ignore <file-name>para verificar. LMK si te funciona
JESii
Solo funcionó para mí sin =:git config --global core.excludesfile ~/.gitignore
E. Sundin
Puse un .gitignorearchivo en el directorio de inicio y le dije a git que lo usara, luego eliminé los archivos que me gustaría rastrear localmente. Sin embargo, después de presionar los cambios, el repositorio remoto también eliminó esos archivos. ¿Hice algo mal?
zyy
Wow, @xyz; .gitignorese trata de ignorar los archivos que existen en su directorio local. Lo que debería haber hecho es git rm --cachedeliminarlos del repositorio pero dejarlos en su local. Debería poder volver a su confirmación anterior con algo como git reset --soft HEAD^deshacer esa confirmación y recuperar sus archivos. Esa es la belleza de git: todo sigue ahí en tu historia de git.
JESii
2

Para ignorar los archivos no rastreados, especialmente si se encuentran en (algunas) carpetas que no se rastrean, una solución simple es agregar un .gitignorearchivo a cada carpeta no rastreada e ingresar en una sola línea que contenga *seguida de una nueva línea. Es una solución realmente simple y directa si los archivos no rastreados están en algunas carpetas. Para mí, todos los archivos provenían de una sola carpeta sin seguimiento vendory lo anterior simplemente funcionó.

aak318
fuente
1
¡Excelente! FYI: Esto funciona solo porque git solo rastrea (y le permite confirmar) archivos, no carpetas.
jmiserez
-2

Si su repositorio aún no tiene un archivo .gitignore, entonces una solución simple es crear un archivo .gitignore y agregarlo .gitignorea la lista de archivos a ignorar.

Gavin S. Yancey
fuente
44
¿Y qué pasa si el equipo quiere agregar para agregar un gitignore más tarde? ¿Esto incluso funciona? Suena como una idea terrible y como algo que ni siquiera debería funcionar.
Bjorn
La respuesta de este chico me hizo reír. De ninguna manera alguien está haciendo esto.
Martyn Chamberlin
Esta es una solución rápida y simple, siempre que haya un lugar para ponerla. Nuestro repositorio tiene un .gitignorearchivo compartido en la parte superior. Pero mis archivos sucios están en una carpeta profunda, así que agregué los míos .gitignorejunto a ellos. +1
joeytwiddle