2012-05-23 28 views
100

¿Hay alguna manera de ignorar todos los archivos de un tipo en un directorio?gitignore todos los archivos de extensión en el directorio

** es aparentemente sin sentido para GIT, así que esto no funciona:

/public/static/**/*.js 

La idea es hacer coincidir las carpetas anidadas arbitrarias.

+1

posible duplicado de [Git-ignore ciertos archivos en subdirectorios, pero no todos] (http://stackoverflow.com/questions/6794717/git-ignore-certain-files-in-sub -directories-but-not-all) –

Respuesta

75

nunca había probado, pero git help ignore sugiere que si se pone un .gitignore con *.js en /public/static, que va a hacer lo que quiere.

Nota: asegúrese también de ver la respuesta de Joeys a continuación: si desea ignorar archivos en un subdirectorio específico, entonces 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.

+3

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 de repo. – haren

+1

@haren no es la única solución. La respuesta de Joey también es válida. Elija lo que mejor funcione para usted. Argumentaría que ignorar las reglas locales para 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

47

ACTUALIZACIÓN: Eche un vistazo a @Joey's answer: Git ahora es compatible con la sintaxis ** en los patrones. Ambos enfoques deberían funcionar bien.


Los gitignore(5) man page estados:

patrones leídos desde un archivo .gitignore en el mismo directorio que el camino, o en cualquier directorio padre, con motivos en los archivos de nivel superior (hasta el nivel superior del árbol de trabajo) que los archivos de nivel inferior anulan al directorio que contiene el archivo.

Lo que esto significa es que los patrones en un archivo .gitignore en cualquier directorio dado de tu repositorio afectarán ese directorio y todos los subdirectorios.

El patrón que proporciona

/public/static/**/*.js 

no es del todo bien, en primer lugar porque (como se ha anotado correctamente) la sintaxis ** no es utilizado por Git. Además, el / líder ancla ese patrón al inicio del nombre de ruta. (Por lo tanto, /public/static/*.js coincidirá con /public/static/foo.js pero no /public/static/foo/bar.js.) Extracción del líder / tampoco funcionará, igualando caminos como public/static/foo.js y foo/public/static/bar.js. EDITAR: La eliminación de la barra diagonal no funcionará tampoco: como el patrón contiene una barra oblicua, Git lo trata como un englobador de shell sin recurrencia (gracias @Joey Hoer para señalar esto).

Como @ptyx sugirió, lo que hay que hacer es crear el archivo <repo>/public/static/.gitignore e incluir 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 directorio /public/static y sus subdirectorios.

+2

Esto no es del todo cierto, específicamente la parte "Eliminar el encabezado'/'tampoco funcionará, haciendo coincidir rutas como' public/static/foo.js' y 'foo/public/static/bar.js'." Es falso. Para citar [la documentación] (http://git-scm.com/docs/gitignore/) "Si el patrón no contiene una barra inclinada//, Git lo trata como un patrón glob de shell y busca una coincidencia con el nombre de ruta relativo a la ubicación del archivo .gitignore (relativo al toplevel del árbol de trabajo si no es de un archivo .gitignore). " 'foo/public/static/bar.js' no se correspondería porque el patrón contiene un'/'. – joeyhoer

+0

@JoeyHoer Gracias por la sugerencia, actualicé mi respuesta en consecuencia. –

9

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

+0

Esto no pasaría a otros clones del repositorio como lo haría .gitignore (después de haberse comprometido, por supuesto). – jpmc26

128

Parece que la sintaxis ** es compatible con git a partir de la versión 1.8.2.1 según the documentation.

Dos asteriscos consecutivos ("** ') en los patrones emparejados contra la ruta completa pueden tener un significado especial:

  • Un líder' **" seguido de una barra significa coincidencia en todos los directorios. Para el ejemplo , "**/foo" coincide con el archivo o directorio "foo" en cualquier lugar, el mismo como patrón "foo". "**/foo/bar" coincide con el archivo o directorio "bar" en cualquier lugar que se encuentre directamente debajo del directorio "foo".

  • Un trailing "/**" coincide con todo dentro. Por ejemplo, "abc/**" coincide con todos los archivos dentro del directorio "abc", relativo a la ubicación del archivo .gitignore, con profundidad infinita.

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

  • Otros asteriscos consecutivos se consideran no válidos.

+1

¿cuál es la diferencia entre 'xxx/**' y 'xxx /'? – thuzhf

+6

'xxx/**' se dirige a todos los archivos y directorios dentro de 'xxx', mientras que' xxx/'se dirige directamente al directorio' xxx'. Esto realmente solo importa al negar los patrones con '!' Como "No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo.", Por lo que usar 'xxx/*' o 'xxx/**' sería ser necesario en ese caso. – joeyhoer

+1

git debe ignorar todos los archivos con el final .meta. ¿Como funciona esto? '**. js'? – Black

Cuestiones relacionadas