regex - subfolders - explicar la coincidencia de patrones gitignore
gitignore not working (1)
Tengo el siguiente árbol de directorios:
> #pwd is the repo
> tree -a
.
├── .git
│ |.....
├── .gitignore
├── README.md
├── f1.html
├── f2.html ... and some more html
├── images
│ └── river.jpg
>
También tengo lo siguiente en mi .gitignore
:
> cat .gitignore
*
!*.html
!images/*.*
>
Me gustaría que todos los archivos en el directorio de imágenes se incluyan en el repositorio. Pero eso no está sucediendo. Lo hice funcionar usando lo siguiente en gitignore:
*
!*.html
!images*
!*.jp*g
¿Que está sucediendo aquí? ¿Hay una manera infalible de probar gitignore. Revisé la documentation . Aquí está el punto que no entiende (bajo el encabezado del formato de patrón ):
De lo contrario, Git trata el patrón como un globo de shell adecuado para el consumo de fnmatch (3) con el indicador FNM_PATHNAME: los comodines en el patrón no coincidirán con / en la ruta de acceso. Por ejemplo, "Documentation / *. Html" coincide con "Documentation / git.html" pero no con "Documentation / ppc / ppc.html" o "tools / perf / Documentation / perf.html".
Primero, la parte difícil en tu pregunta es la primera línea en el archivo .gitignore
:
* // Says exclude each and every file in the repository,
// unless I specify with ! pattern explicitly to consider it
Primero consideraremos la primera versión de su .gitignore
.
-
*
Excluir todos los archivos en el repositorio. -
!*.html
permite todos los archivos html. -
!images/*.*
considere todos los tipos de archivos en la carpeta de imágenes.
Para incluir todos los archivos JPG / JPEG, simplemente podría haber agregado !*.jp*g
en la tercera línea, lo que hubiera hecho que git considerara todos los archivos jpg y jpeg independientemente de la carpeta donde se encuentre ese archivo. Pero específicamente quería solo de la carpeta de imágenes y no solo de jpg, cualquier tipo de archivo en la carpeta de imágenes. Leamos algo de documentación relacionada con él y en la sección 3 iremos a la parte de la solución.
Git ignora el patrón con respecto a la consideración de la carpeta:
Patrón que termina solo con una barra : Si un patrón termina con
<dir-name>/
, git ignorará los archivos contenidos en ese directorio y todos los demás subdirectorios. Como ejemplo dado en la documentación.foo/
coincidirá con un directorio foo y rutas debajo de él, pero no coincidirá con un archivo normal o un enlace simbólico foopero también tenga en cuenta que si algún patrón coincide con un archivo en el directorio excluido, git no lo considera.
El patrón no tiene barra diagonal : si está especificando el nombre de directorio en la lista de ignorados que no termina con una barra, git lo considerará solo un patrón, que puede coincidir con cualquier archivo que tenga esa ruta de acceso.
Si el patrón no contiene una barra oblicua, Git lo trata como un patrón global de shell y comprueba si hay una coincidencia con la ruta de acceso relativa a la ubicación
Patrón con barra diagonal y carácter especial (* /?) : Si el patrón termina como el primer ejemplo que dio,
images/*.*
Funciona como se especifica en la documentaciónEjemplo: "Documentation / *. Html" coincide con "Documentation / git.html" pero no con "Documentation / ppc / ppc.html" o "tools / perf / Documentation / perf.html".
Solución
Considerando el tercer punto, git debe considerar todos los archivos en el directorio de !images/*.*
patrón !images/*.*
. Pero no lo está haciendo porque la documentación dice un punto más importante.
Git no lista directorios excluidos
Debido a la primera línea *
el directorio "images" se ignora. Así que primero debemos decirle al git que considere el directorio de imágenes y luego las líneas adicionales explícitamente para que consideren los otros tipos (si es necesario).
*
!*.html
!images/ // <- consider images folder
!images/*.*
Nota : la última línea considera todos los tipos de archivos solo del directorio de imágenes, no de ninguno de sus subdirectorios. (3er punto en la sección 2)