git - not - Ignorar correctamente todos los archivos de forma recursiva en una carpeta específica, excepto un tipo de archivo específico
gitignore doesn t ignore folder (4)
Esto puede parecer estúpido, pero verifique si no ha agregado la carpeta / archivos que está tratando de ignorar anteriormente. Si lo hizo, no importa lo que coloque en su archivo .gitignore, las carpetas / archivos aún estarán en escena.
He visto preguntas similares ( 1 , 2 y 3 ), pero no obtengo una solución adecuada de ellas.
Necesito ignorar todos los archivos en una carpeta en particular, excepto un tipo de archivo específico. La carpeta es un subdirectorio de la ruta raíz. Déjame nombrar los Resources
la carpeta. Ya que no quiero complicar las cosas, permítame ignorar los archivos en todas las carpetas llamadas Resources
donde sea que estén.
Esta es la solución más común (en todas las preguntas duplicadas)
# Ignore everything
*
# Don''t ignore directories, so we can recurse into them
!*/
# Don''t ignore .gitignore
!.gitignore
# Now exclude our type
!*.foo
El problema con esta solución es que deja de rastrear los archivos recién agregados (ya que *
ignora todos los archivos). No quiero seguir excluyendo cada tipo de archivo. Quiero un comportamiento normal donde, si se agrega un nuevo archivo, el git status
muestra.
Finalmente tengo una solución here . La solución es agregar otro archivo .gitignore
en la carpeta Resources
. Esto funciona correctamente.
¿Puedo lograr lo mismo con un archivo de ignorar? Me parece que tener muchos archivos ignorados en directorios diferentes es un poco torpe.
Esto es lo que estoy tratando de lograr:
# Ignore everything under Resources folder, not elsewhere
Resources
# Don''t ignore directories, so we can recurse into them
!*Resources/
# Now exclude our type
!*.foo
Pero esto da la salida opuesta. Ignora los tipos *.foo
y rastrea otros archivos.
La mejor respuesta es agregar un archivo Resources / .gitignore en Resources que contiene:
# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo
Si no desea o no puede agregar ese archivo .gitignore, hay una solución poco elegante:
# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo
Deberá editar ese patrón si agrega directorios más profundos de lo especificado.
Lo estoy haciendo mal o la respuesta aceptada ya no funciona con git actual.
De hecho, encontré la solución adecuada y la publiqué en casi la misma pregunta here . Para más detalles dirígete allí.
Solución:
# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won''t be commited anyway if there is no commited file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Desde git 1.8.2, Resources/** !Resources/**/*.foo
funciona.