Pregunta sobre gitignore, git – gitignore todos los archivos de extensión en el directorio

140

¿Hay una manera de ignorar todos los archivos de un tipo en un directorio?

** Aparentemente no tiene sentido para git, así que esto no funciona:

/public/static/**/*.js

La idea es hacer coincidir carpetas anidadas arbitrarias.

Tu respuesta

5   la respuesta
164

Parece que el** la sintaxis es soportada porgit a partir de la versión1.8.2.1 de acuerdo ala documentación.

Dos asteriscos consecutivos ("**") en los patrones que coincidan con la ruta de acceso completa puede tener un significado especial:

Un liderazgo "**"seguido de una barra diagonal significa coincidir 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 bajo el directorio"foo".

Un rastro "/**"coincide con todo el interior. Por ejemplo,"abc/**"coincide con todos los archivos dentro del directorio"abc", en relación a la ubicación de la.gitignore Lima, con profundidad infinita.

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

Otros asteriscos consecutivos se consideran inválidos.

xxx/** Se dirige a todos los archivos y directorios dentro dexxx mientrasxxx/ apunta elxxx directorio directamente Esto realmente solo importa cuando se niegan patrones con! como "No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo", por lo que se usaxxx/* oxxx/** Sería necesario en ese caso. joeyhoer
"Otros asteriscos consecutivos se consideran inválidos". lo resume todo imrok
Todos los archivos con la terminación .meta deben ser ignorados por git. ¿Como funciona esto?**.js ? Black
Cuál es la diferencia entrexxx/** yxxx/? thuzhf
61

ACTUALIZACIÓN: Echa un vistazo aLa respuesta de @Joey: Git ahora soporta el** sintaxis en los patrones. Ambos enfoques deberían funcionar bien.

losPágina de manual de gitignore (5) estados

Los patrones se leen desde 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 los de los archivos de nivel inferior hasta el directorio que contiene el archivo.

Lo que esto significa es que los patrones en una.gitignore archivo en cualquier directorio dado de su repositorio afectaráese directorio ytodos los subdirectorios.

El patrón que proporcionaste

/public/static/**/*.js

no está del todo bien, en primer lugar porque (como se ha señalado correctamente) la** La sintaxis no es utilizada por Git. Además, el líder/ Ancla ese patrón al inicio de la ruta. (Asi que,/public/static/*.js coincidirá/public/static/foo.js perono /public/static/foo/bar.js.)Quitando el líder/ Tampoco funcionará, haciendo coincidir caminos comopublic/static/foo.js yfoo/public/static/bar.js. EDITAR: Solo eliminar la barra diagonal inicial tampoco funcionará, ya que el patrón aún contiene una barra diagonal, Git la 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/.gitignore e incluye solo este patrón:

*.js

No hay líder/, 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.

Esto no es del todo cierto, específicamente la parte "Eliminación de los líderes/ Tampoco funcionará, haciendo coincidir caminos comopublic/static/foo.js yfoo/public/static/bar.js. "es falso. Para citarla documentación "Si el patrón no contiene una barra inclinada /, 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 del archivo .gitignore (en relación con el nivel superior del árbol de trabajo, si no es desde a. archivo gitignore) ".foo/public/static/bar.js no coincidiría porque el patrón contiene una/. joeyhoer
@JoeyHoer, gracias a la sugerencia, he actualizado mi respuesta en consecuencia. Adam Sharp
9

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

Esto no se trasladaría a otros clones del repositorio como lo haría .gitignore (después de comprometerse, por supuesto). jpmc26
2

Creo que la solución más simple sería usarfind. No me gusta tener multiples.gitignore Dando vueltas en los subdirectorios, prefiero administrar un nivel superior único..gitignore. Para hacerlo, simplemente puede agregar los archivos encontrados a su.gitignore. Suponiendo eso/public/static/ es tu proyecto / git home yo usaría algo como:

find . -type f -name *.js | cut -c 3- >> .gitignore

Encontré que cortar el./ al principio, a menudo es necesario para que git entienda qué archivos evitar. Por lo tanto, elcut -c 3-.

94

Nunca lo intenté, perogit help ignore sugiere que si pones un.gitignore con*.js en/public/static, hará lo que tu quieras.

Nota: asegúrese de verificar también la respuesta de Joey a continuación: si desea ignorar los archivos en un subdirectorio específico, un .gitignore local es la solución correcta (la ubicación es buena). Sin embargo, si necesita el mismo patrón para aplicar a todo su repositorio, entonces la solución ** es mejor.

@haren no es la única solución, la respuesta de Joey también es válida. Elige lo que mejor te funcione. Yo diría que ignorar las reglas locales a 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
No es necesaria la mejor solución. Potencialmente, la gente tendrá que buscar en diferentes archivos .gitignore para descubrir por qué se está ignorando su archivo. Algunos prefieren tener toda esta información en un archivo .gitignore almacenado en el directorio raíz del repositorio. haren

Preguntas relacionadas