usar para generador example ejemplo create crear como comando archivo gitignore

gitignore - para - git ignore comando



¿Diferencia en las rutas en el archivo.gitignore? (6)

Actualización (08-Mar-2016)

Hoy, no puedo encontrar una máquina donde ** no funcione como se afirma. Eso incluye OSX-10.11.3 (El Capitán) y Ubuntu-14.04.1 (Trusty). Posiblemente git-ignore como actualizado, o posiblemente mangos recientes de fnmatch ** como la gente espera. Así que la respuesta aceptada ahora parece ser correcta en la práctica.

Post original

El ** no tiene ningún significado especial en git . Es una característica de bash> = 4.0, vía

shopt -s globstar

Pero git no usa bash . Para ver lo que realmente hace git , puede experimentar con git add -nv y archivos en varios niveles de subdirectorios.

Para el OP, he probado todas las combinaciones que se me ocurren para el archivo .gitignore , y nada funciona mejor que esto:

public/documents/

Lo siguiente no hace lo que todos parecen pensar:

public/documents/**/*.obj

No puedo conseguir que funcione sin importar lo que intente, pero al menos eso es consistente con los documentos de git . Sospecho que cuando la gente agrega eso a .gitignore , funciona por accidente, solo porque sus archivos .obj tienen precisamente un subdirectorio de profundidad. Probablemente copiaron el doble asterisco de un script de bash. Pero quizás hay sistemas donde fnmatch(3) puede manejar el doble asterisco como bash can.

He estado usando git pero todavía tengo confusión acerca de las rutas del archivo .gitignore .

Entonces, ¿cuál es la diferencia entre las siguientes dos rutas en el archivo .gitignore ?

tmp/* public/documents/**/*

Puedo entender que tmp/* ignorará todos los archivos y carpetas que contiene. Estoy en lo cierto Pero, ¿qué significa esa segunda línea de ruta?


Cuando ** no es compatible, el "/" es esencialmente un carácter de terminación para el comodín, por lo que cuando tiene algo como:

public/documents/**/*

Básicamente, está buscando dos elementos comodín entre las barras y no recoge las barras. En consecuencia, esto sería lo mismo que:

public/documents/*/*


Esto depende del comportamiento de tu shell. Git no hace ningún trabajo para determinar cómo expandir estos. En general, * coincide con cualquier archivo o carpeta:

/a/*/z matches /a/b/z matches /a/c/z doesn''t match /a/b/c/z

** coincide con cualquier cadena de carpetas:

/a/**/z matches /a/b/z matches /a/b/c/z matches /a/b/c/d/e/f/g/h/i/z doesn''t match /a/b/c/z/d.pr0n

Combine ** con * para hacer coincidir los archivos en un árbol de carpetas completo:

/a/**/z/*.pr0n matches /a/b/c/z/d.pr0n matches /a/b/z/foo.pr0n doesn''t match /a/b/z/bar.txt


No me funciona, pero podrías crear un nuevo .gitignore en ese subdirectorio:

tmp/**/*.log

puede ser reemplazado por un .gitignore en tmp :

*.log


Si está utilizando un shell como Bash 4, entonces ** es esencialmente una versión recursiva de *, que coincidirá con cualquier número de subdirectorios.

Esto tiene más sentido si agrega una extensión de archivo a sus ejemplos. Para hacer coincidir los archivos de registro inmediatamente dentro de tmp, debe escribir:

/tmp/*.log

Para hacer coincidir los archivos de registro en cualquier subdirectorio de tmp, debe escribir:

/tmp/**/*.log

Pero al probar con la versión 1.6.0.4 de git y la versión 3.2.17 (1) de bash, parece que git no admite ** globs en absoluto. La página de manual más reciente de gitignore tampoco menciona **, por lo que esto es (1) muy nuevo, (2) no es compatible o (3) de alguna manera depende de la implementación de globbing de su sistema.

Además, hay algo sutil en tus ejemplos. Esta expresión:

tmp/*

... en realidad significa "ignorar cualquier archivo dentro de un directorio tmp, en cualquier parte del árbol de origen, pero no ignorar los directorios tmp en sí mismos". En circunstancias normales, probablemente solo escribirías:

/tmp

... lo que ignoraría un solo directorio tmp de nivel superior. Si necesita mantener los directorios tmp alrededor, mientras ignora su contenido, debe colocar un archivo .gitignore vacío en cada directorio tmp para asegurarse de que git realmente cree el directorio.


Tenga en cuenta que el '' ** '', cuando se combina con un subdirectorio ( **/bar ), debe haber cambiado con respecto a su comportamiento predeterminado, ya que la nota de lanzamiento de git1.8.2 ahora menciona:

Los patrones en los archivos .gitignore y .gitattributes pueden tener **/ , como un patrón que coincide con 0 o más niveles de subdirectorio.

Por ejemplo, " foo/**/bar " coincide con " bar " en " foo " en sí mismo o en un subdirectorio de " foo ".

Vea el commit 4c251e5cb5c245ee3bb98c7cedbe944df93e45f4 :

" foo/**/bar " coincide con " foo/x/bar ", " foo/x/y/bar " ... pero no " foo/bar ".
Hacemos un caso especial, cuando se detecta foo/**/ (y la parte " foo/ " ya coincide), intente hacer coincidir " bar " con el resto de la cadena.

La semántica de "Coincidir con uno o más directorios" se puede lograr fácilmente usando " foo/*/**/bar ".

Esto también hace que " **/foo " coincida con " foo " además de " x/foo ", " x/y/foo " ..

Firmado por: Nguyễn Thái Ngọc Duy <[email protected]>

Simon Buchan también commented :

los documentos actuales ( página de manual de .gitignore ) tienen bastante claro que no se necesita un subdirectorio, x/** coincide con todos los archivos en (posiblemente vacío) x

La página de manual de .gitignore menciona:

Un " /** " al 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 archivo .gitignore , 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 " coincide con " a/b ", " a/x/b ", " a/x/y/b " y así sucesivamente.