¿Hay alguna manera de ignorar todos los archivos de un tipo en un directorio?
**
aparentemente no tiene sentido para git, por lo que esto no funciona:
/public/static/**/*.js
La idea es hacer coincidir carpetas anidadas arbitrarias.
¿Hay alguna manera de ignorar todos los archivos de un tipo en un directorio?
**
aparentemente no tiene sentido para git, por lo que esto no funciona:
/public/static/**/*.js
La idea es hacer coincidir carpetas anidadas arbitrarias.
Respuestas:
Nunca había probado, pero git help ignore
sugiere que si se pone una .gitignore
con *.js
en /public/static
, que va a hacer lo que quiere.
Nota: asegúrese de consultar también la respuesta de Joeys a continuación: si desea ignorar los archivos en un subdirectorio específico, un .gitignore local es la solución correcta (la localidad es buena). Sin embargo, si necesita el mismo patrón para aplicar a su repositorio completo, entonces la solución ** es mejor.
Parece que la **
sintaxis es compatible con la git
versión de 1.8.2.1
acuerdo con la documentación .
Dos asteriscos consecutivos ("
**
") en patrones que coinciden con el nombre de ruta completo pueden tener un significado especial:
Un "
**
" inicial seguido de una barra inclinada significa coincidencia en todos los directorios. Por ejemplo, "**/foo
" coincide con el archivo o directorio "foo
" en cualquier lugar, igual que el patrón "foo
". "**/foo/bar
" coincide con el archivo o directorio "bar
" en cualquier lugar que esté directamente debajo del directorio "foo
".Un "
/**
" final coincide con todo lo que hay dentro. Por ejemplo, "abc/**
" coincide con todos los archivos dentro del directorio "abc
", en relación con la ubicación del.gitignore
archivo, con profundidad infinita.Una barra inclinada seguida de dos asteriscos consecutivos y luego una barra inclinada coincide con cero o más directorios. Por ejemplo, "
a/**/b
" coincide "a/b
", "a/x/b
", "a/x/y/b
" y así sucesivamente.Otros asteriscos consecutivos se consideran inválidos.
xxx/**
y xxx/
?
xxx/**
apunta a todos los archivos y directorios dentro de xxx
mientras que xxx/
apunta al xxx
directorio directamente. Esto realmente solo importa cuando se niegan patrones con !
"No es posible volver a incluir un archivo si se excluye un directorio padre de ese archivo", por lo que usar xxx/*
o xxx/**
sería necesario en ese caso.
**.js
?
ACTUALIZACIÓN: Eche un vistazo a la respuesta de @ Joey : Git ahora admite la **
sintaxis en los patrones. Ambos enfoques deberían funcionar bien.
La página del comando man gitignore (5) dice:
Los patrones leídos de un archivo .gitignore en el mismo directorio que la ruta, o en cualquier directorio principal, con patrones en los archivos de nivel superior (hasta el nivel superior del árbol de trabajo) anulados por aquellos en archivos de nivel inferior hasta el directorio que contiene el archivo
Lo que esto significa es que los patrones en un .gitignore
archivo en cualquier directorio dado de su repositorio afectarán ese directorio y todos los subdirectorios .
El patrón que proporcionaste
/public/static/**/*.js
no es del todo correcto, en primer lugar porque (como notó correctamente) la **
sintaxis no es utilizada por Git. Además, las /
anclas iniciales que patrón al inicio del nombre de ruta. (Por lo tanto, /public/static/*.js
coincidirá /public/static/foo.js
pero no /public/static/foo/bar.js
). Quitar el inicio EDITAR: simplemente eliminar la barra inclinada tampoco funcionará, ya que el patrón todavía contiene una barra inclinada, Git lo trata como un globo de shell simple y no recursivo (gracias @Joey Hoer por señalar esto)./
tampoco funcionará, coincidiendo con rutas como public/static/foo.js
y foo/public/static/bar.js
.
Como sugirió @ptyx, lo que debe hacer es crear el archivo <repo>/public/static/.gitignore
e incluir solo este patrón:
*.js
No hay encabezado /
, por lo que coincidirá en cualquier parte de la ruta, y ese patrón solo se aplicará a los archivos en el /public/static
directorio y sus subdirectorios.
/
tampoco funcionará, haciendo coincidir rutas como public/static/foo.js
y foo/public/static/bar.js
". Es falso. Para citar la documentación "Si el patrón no contiene una barra oblicua /, Git lo trata como un patrón glob de shell y comprueba una coincidencia con el nombre de ruta en relación con la ubicación del archivo .gitignore (en relación con el nivel superior del árbol de trabajo si no de un archivo .gitignore) ". foo/public/static/bar.js
no coincidiría porque el patrón contiene a /
.
Para ignorar los archivos no rastreados solo vaya a .git / info / exclude. Excluir es un archivo con una lista de extensiones o archivos ignorados.
Creo que la solución más simple sería usar find
. No me gusta tener múltiples .gitignore
merodeando en subdirectorios y prefiero administrar un nivel superior único .gitignore
. Para hacerlo, simplemente puede agregar los archivos encontrados a su .gitignore
. Suponiendo que ese /public/static/
sea su proyecto / git home, usaría algo como:
find . -type f -name *.js | cut -c 3- >> .gitignore
Descubrí que cortar ./
al principio a menudo es necesario para que git entienda qué archivos evitar. Por lo tanto el cut -c 3-
.