gitignore todos los archivos de extensión en el directorio

Respuestas:

121

Nunca había probado, pero git help ignoresugiere que si se pone una .gitignorecon *.jsen /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.

ptyx
fuente
19
Esa no es necesariamente la mejor solución. Potencialmente, las personas necesitarán explorar diferentes archivos .gitignore para descubrir por qué se ignora su archivo. Algunos prefieren tener toda esta información en un archivo .gitignore almacenado en el directorio raíz del repositorio.
haren
1
@haren no es la única solución: la respuesta de Joey también es válida. Elija lo que funcione mejor para usted. Yo diría que ignorar las reglas locales de un directorio debería estar en ese directorio, y que las reglas globales deberían ser globales. (Además, esta respuesta es antigua y no creo que ** fuera compatible en ese momento).
ptyx
209

Parece que la **sintaxis es compatible con la gitversión de 1.8.2.1acuerdo 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 .gitignorearchivo, 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.

joeyhoer
fuente
1
¿Cuál es la diferencia entre xxx/**y xxx/?
Jueves
9
xxx/**apunta a todos los archivos y directorios dentro de xxxmientras que xxx/apunta al xxxdirectorio 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.
joeyhoer
44
Git debe ignorar todos los archivos con el .meta final. ¿Como funciona esto? **.js?
Negro
"Otros asteriscos consecutivos se consideran inválidos". lo resume todo
imrok
68

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 .gitignorearchivo 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/*.jscoincidirá /public/static/foo.jspero no /public/static/foo/bar.js ). Quitar el inicio /tampoco funcionará, coincidiendo con rutas como public/static/foo.jsy foo/public/static/bar.js. 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).

Como sugirió @ptyx, lo que debe hacer es crear el archivo <repo>/public/static/.gitignoree 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/staticdirectorio y sus subdirectorios.

Adam Sharp
fuente
2
Esto no es del todo cierto, específicamente la parte "Quitar el líder /tampoco funcionará, haciendo coincidir rutas como public/static/foo.jsy 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.jsno coincidiría porque el patrón contiene a /.
joeyhoer
@JoeyHoer gracias por el consejo, he actualizado mi respuesta en consecuencia.
Adam Sharp
9

Para ignorar los archivos no rastreados solo vaya a .git / info / exclude. Excluir es un archivo con una lista de extensiones o archivos ignorados.

Thiago Ramos
fuente
1
Esto no se transferiría a otros clones del repositorio como lo haría .gitignore (después de haberse comprometido, por supuesto).
jpmc26
3

Creo que la solución más simple sería usar find. No me gusta tener múltiples .gitignoremerodeando 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-.

Garini
fuente