Listas blancas y subdirectorios en Git

4 minutos de lectura

Listas blancas y subdirectorios en Git
Nate

He creado una lista blanca solo para archivos de texto.

*
!*.txt

Ahora, tengo un archivo de texto sin seguimiento en un subdirectorio: sub/dir/file.txt, y NO se muestra (se ignora). Sin embargo, se muestran los archivos de texto en el directorio raíz.

¿Por qué es eso y cómo lo soluciono?

  • Relacionado: stackoverflow.com/q/987142/78845

    – Johnsyweb

    6 de febrero de 2012 a las 16:09

  • ¿Están los archivos que desea incluir en un subdirectorio? Si es así, este subdirectorio ya podría ser ignorado por la primera estrella en su .gitignore.

    – fajrán

    6 de febrero de 2012 a las 16:11

  • Si. Estos archivos estarán tan abajo en la estructura de directorios como la carpeta 11.1.102.55 en mi ejemplo. El anidamiento no siempre es el mismo entre carpetas/productos.

    – Nate

    6 de febrero de 2012 a las 17:05

  • Conozco esta funcionalidad. Tenemos cientos de directorios. Sería más rápido simplemente ignorar explícitamente los tipos de archivo que no queremos que hacer un gitignore para cada directorio. Realmente estoy buscando una manera de sacar la funcionalidad de la lista blanca del archivo .gitignore.

    – Nate

    6 de febrero de 2012 a las 19:11

  • No veo cómo esto es un duplicado. La otra pregunta es cómo incluir en la lista blanca ciertos archivos, mientras que esta pregunta cómo incluir en la lista blanca ciertos tipos de archivos, incluidas las subcarpetas. En realidad, es más como un duplicado de stackoverflow.com/questions/8024924/….

    – Gran McLargeEnorme

    17 de abril de 2013 a las 16:01


1646746630 894 Listas blancas y subdirectorios en Git
simón

Si lo intenta de esa manera, fallará, porque terminará poniendo en la lista negra los directorios de su estructura.

Para resolverlo, desea incluir en la lista negra todo lo que no sea un directorio y no sea uno de los tipos de archivo que desea confirmar, mientras no esté en la lista negra de directorios.

los .gitignore archivo que hará esto:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Probé esto en una lista blanca de estructura de tres niveles para .txt archivos en presencia de *.one, *.two y *.three archivos usando un .gitignore ubicado en el directorio raíz del repositorio, funciona para mí. No tendrás que agregar .gitignore archivos a todos los directorios de su estructura.

La información que usé para averiguar la respuesta provino, entre otras cosas, de esto (stackoverflow.com).

  • También necesitas la entrada. !.gitignorecuando usas *¿no?

    – sjas

    6 de agosto de 2013 a las 18:49

  • Vea mi respuesta aquí: stackoverflow.com/questions/987142/… Puede ser más útil usar /* poner en la lista negra solo la carpeta de nivel superior, pero no todas las carpetas recursivamente, lo que en realidad significa .gitignore no debe buscar en las subcarpetas de una carpeta incluida en la lista blanca.

    – RyanTaylor

    21 de julio de 2015 a las 2:13


1646746631 527 Listas blancas y subdirectorios en Git
Sharadh

Una forma más sencilla de lograr esto es:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

Esto funciona porque gitignore aplica patrones que no comienzan con / a todos los niveles por debajo del .gitignore expediente:

Si hay un separador al principio o en medio (o ambos) del patrón, entonces el patrón es relativo al nivel de directorio del archivo .gitignore en particular. De lo contrario, el patrón también puede coincidir en cualquier nivel por debajo del nivel .gitignore.

Si quisiera hacer esto con los archivos dentro de un directoriolas cosas se vuelven más complejas:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Esto funciona porque gitignore tiene reglas especiales para **:

Dos asteriscos consecutivos (“**“) en patrones coincidentes con el nombre de ruta completo puede tener un significado especial:

  • Una barra inclinada seguida de dos asteriscos consecutivos y luego una barra inclinada coincide con cero o más directorios. Por ejemplo, “a/**/b” partidos “a/b“, “a/x/b“, “a/x/y/b” y así.

La pieza clave es asegurarse de no ignorar los directorios, porque entonces todos los archivos dentro de ese directorio se ignoran independientemente de otras reglas.

Listas blancas y subdirectorios en Git
Alex

Busqué durante mucho tiempo:

  1. Supongamos que tengo una estructura de carpetas grande con ~100.000 directorios anidados recursivamente. En esas carpetas hay unos 30.000 archivos de tipo .txt (en mi caso: tipo *.md). Junto a estos *.md archivos, hay, digamos, 500 GB de (más de un millón) de archivos que no quiero rastrear.

  2. Quiero que git rastree solo .txt (o *.md) archivos en todas las carpetas y subdirectorios.

La respuesta correcta debería ser: esto no es posible en Git.

Lo que hice en su lugar:

[edit: did also not work –
I tried to create a folder with symlinks (or hardlinks) and use git there, but git doesn’t follow symlinks and overwrites hardlinks. Doh!]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad