2011-11-16 14 views
17

Tengo dos archivos que desea ignorar:¿Por qué no funciona gitignore en este caso?

  • .idea/workspace.xml
  • SomeApp/src/.idea/workspace.xml

pensé añadir esta sola regla. gitignore será suficiente:

.idea/workspace.xml 

Pero sólo capta el nivel superior .idea/workspace.xml (git status muestra SomeApp/src/.idea/workspace.xml como sin seguimiento).

También probé **/.idea/workspace.xml, pero esto no funciona en absoluto. ¿Ayuda?

+0

Intente también ignorar 'someapp/src/.idea/workspace.xml'? – Shahbaz

+0

Quizás * workspace.xml hará? – chelmertz

+0

@Shahbaz - eso funciona, pero no entiendo por qué .idea/workspace.xml no. – ripper234

Respuesta

11
  • [...]
  • Si el patrón no contiene una barra /, Git lo trata como un patrón global cáscara y comprueba si hay un partido contra el nombre de ruta relativa a la ubicación del archivo .gitignore (relativo al nivel superior del árbol de trabajo si no es de un archivo .gitignore).
  • De lo contrario, git trata el patrón como un comodín adecuado para el consumo por fnmatch (3) con el indicador FNM_PATHNAME: los comodines en el patrón no coincidirán con a/en el nombre de ruta. [...]

Tan pronto como la ruta contiene una barra, Git ya no comprobar si hay una coincidencia en el camino, sino que utilizará el comportamiento pegote directamente. Como tal, no puede coincidir con .idea/workspace.xml, pero solo para workspace.xml.

Git manual: gitignore.

+0

¿No es su conclusión lo opuesto a lo que dice el manual? – manojlds

+0

@manojlds Espero que no ...:/Si el patrón no contiene una barra, coincidirá con el nombre de ruta, pero si contiene una barra, ya no lo hará y se empalmará directamente. – poke

+0

yup que está al revés. no slash = coincidencia global. slash = sin coincidencia global. glob significa "* puede coincidir con una barra" –

0

De acuerdo con la página del manual gitignore:

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 a nivel superior del árbol de trabajo) siendo reemplazado por aquellos en archivos de nivel inferior hasta el directorio que contiene el archivo. Estos patrones coinciden con la ubicación del archivo .gitignore. Un proyecto normalmente incluye tales archivos .gitignore en su repositorio, que contienen patrones para archivos generados como parte de la compilación del proyecto.

(el énfasis es mío)

5

Véanse los ejemplos en el manual gitignore:

"Documentación/* html" coincidencias "Documentación/git.html", pero no "Documentación/ppc/ppc.html" o "herramientas/Potencia/Documentación/perf.html"

Así .idea/workspace.xml coincidirá con la raíz, pero no someapp/src/.idea/workspace.xml

Pero dependiendo de su implementación fnmatch, esto es lo que necesita en su.gitignore:

.idea/workspace.xml 
**/.idea/workspace.xml 
+1

Esto, de hecho, no funciona para mí. – ripper234

+0

@ ripper234 - Como dije, depende de la implementación de fnmatch. Funciona para mi. – manojlds

+2

Estoy en Windows, quizás esta es la razón de la diferencia. – ripper234

2

probar esto

/**/.idea/workspace.xml

20

Esto tiene changed in git 1.8.4

El uso de fnmatch plataforma (3) función (muchos lugares como coincidente pathspec, .gitignore y .gitattributes) han sido reemplazados por wildmatch, permitiendo "foo/**/bar" para que coincida con "foo/bar", "foo/a/bar", etc.

**/.idea/workspace.xml debería funcionar ahora en este ejemplo.

Cuestiones relacionadas