Cómo .gitignore archivos de forma recursiva

106

Estoy tratando de evitar el siguiente patrón en mi .gitignorearchivo.

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Nosotros tratamos:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

Sin embargo, esto no funcionó. Esto es git en Windows. ¿Existe una forma más concisa de hacer esto sin repetir las cosas?

orad
fuente

Respuestas:

116

A partir de git 1.8.2, esto:

MyPrject/WebApp/Scripts/special/**/*.js

Debería funcionar de acuerdo con esta respuesta . También me funciona en Windows 7 usando Sourcetree 1.6.12.0 y la versión de git que instala (1.8.4-preview20130916).

Para ignorar todos los archivos y carpetas de un directorio de forma recursiva:

MyPrject/WebApp/Scripts/special/**
Sam
fuente
¿Y antes de git 1.8?
cenizas999
1
Si esta respuesta no funciona (en Windows), agregue el carácter /al principio. Ejemplo:/MyProject/WebApp/Scripts/special/**/*.js
batressc
3
Me avergüenza que mi respuesta siga recibiendo votos positivos cuando es literalmente un enlace a otra respuesta.
Sam
1
@puk: .gitignoreen esta pregunta estaba en la raíz del repositorio (directorio principal de /Webapp).
lucid_dreamer
1
Su respuesta se ve bien, pero no funcionó para mí en Windows 10 con git 1.9.1 por ignorar todos los archivos excepto js en el siguiente caso: (primera línea) foo/bar/*/*(segunda línea) !foo/bar/**/*.jsFuncionó solo para un nivel de subdirectorios, pero no de forma recursiva.
LLL
19

Siguiente página de manual de gitignore:

[...] git trata el patrón como un glob de shell adecuado para el consumo de fnmatch (3) con el indicador FNM_PATHNAME: los comodines en el patrón no coincidirán con un / en el nombre de la ruta.

Entonces, esto claramente significa que no hay forma de especificar una cierta cantidad de directorios entre dos cadenas, como entre specialy js.

Sin embargo, puede tener un .gitignorearchivo por directorio, por lo que tal vez en su caso el siguiente contenido

*.js

en el siguiente lugar

MyPrject/WebApp/Scripts/special/.gitignore

sería suficiente?

Guillaume Lemaître
fuente
Solía ​​tener MyPrject/WebApp/Scripts/special*.jsy encajaba MyPrject/WebApp/Scripts/specialfile.jstan bien como MyPrject/WebApp/Scripts/special/a/b/c/file.js. Sin embargo, por alguna razón, el comportamiento ha cambiado y mi solución actual es enumerar los directorios individualmente. Estoy usando GitHub para Windows.
orad
1
Por ejemplofind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill
9

Esto me funciona en osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Jonathan
fuente
0

Intente ejecutar git rm -r --cached MyPrject/WebApp/Scripts/special/ Su directorio mencionado podría haber sido almacenado en caché por git y aparecerá en archivos sin seguimiento. Después de borrar el caché, asegúrese de tenerlo mencionado .gitignore.

Pradipta Sarma
fuente