Ignore correctamente todos los archivos de forma recursiva en una carpeta específica, excepto por un tipo de archivo específico


89

He visto preguntas similares ( 1 , 2 y 3 ), pero no obtengo una solución adecuada de ellas.

Necesito ignorar todos los archivos de una carpeta en particular, excepto un tipo de archivo específico. La carpeta es un subdirectorio de la ruta raíz. Déjame nombrar la carpeta Resources. Como no quiero complicar las cosas, permítanme ignorar los archivos de todas las carpetas con el nombre Resourcesque sea.

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 todos y cada uno de los tipos de archivos. Quiero un comportamiento normal donde si se agrega algún archivo nuevo, lo git statusmuestra.

Finalmente obtuve una solución aquí . La solución es agregar otro .gitignorearchivo en la Resourcescarpeta. Esto funciona correctamente.

¿Puedo lograr lo mismo con un archivo ignorado? Me parece un poco torpe tener muchos archivos ignorados en diferentes directorios.

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 *.footipos y rastrea otros archivos.

Respuestas:


108

@SimonBuchan tiene razón.

Desde git 1.8.2, Resources/** !Resources/**/*.foofunciona.


1
Esto funciona para mí, pequeño ajuste, solo necesito eliminar los directorios y todo lo que está debajo de ellos, así que lo hice: DirectoryName1/** DirectoryName1/**/*para cada uno de ellos. Primero eliminan directorios, pero necesita el segundo para eliminar todos los tipos de archivos.
Scala Enthusiast

27

La mejor respuesta es agregar un archivo Resources / .gitignore en Resources que contenga:

# 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.


2
Eso es triste ... De hecho, tendré directorios más profundos, así que me
quedaré

Vea más detalles sobre la misma solución aquí: stackoverflow.com/questions/7803689/… - también vinculado anteriormente por OP @nawfal
aquí

7

Esto puede parecer estúpido, pero verifique si aún no ha agregado la carpeta / archivos que está tratando de ignorar al índice antes. Si lo hizo, no importa lo que coloque en su archivo .gitignore, las carpetas / archivos aún estarán almacenados.


5
Si alguien se encuentra con este caso de uso específico, puede usar git rm --cached <path to files>para borrar esos archivos ignorados de git mientras los deja en el sistema de archivos.
slothluvchunk

5

O lo estoy haciendo mal o la respuesta aceptada ya no funciona con el git actual.

De hecho, encontré la solución adecuada y la publiqué en casi la misma pregunta aquí . Para más detalles dirígete allí.

Solución:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

2
Sí, esto funciona para mí. Agregar !/Resources/**/fue crucial para que git no ignorara los subdirectorios.
Johnster
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.