2010-02-11 11 views
10

Al usar Mercurial, necesito ignorar todos los archivos excepto aquellos en un directorio determinado llamado "keepers".Mercurial .hgignore Negative Lookahead

En apariencia, esto parecía fácil usando Regex y Negative Lookahead; sin embargo, aunque puedo verificar mi expresión regular en Regex Buddy y otras herramientas, en TortoiseHg, no funciona como se esperaba.

Archivos:

  • chatarra \ junk.txt
  • chatarra \ texto
  • guardianes \ test \ test
  • guardianes \ test \ test2 \ hi.txt
  • keepersblah.txt

Solo los dos archivos bajo keepers no deben ser ignorados.

Aquí es la expresión regular que yo esperaba que trabajar:

^(?!keepers/).+$ 

Lamentablemente, esto hace que todos los archivos a ser ignorados. Si lo cambio a:

^(?!keepers).+$ 

funciona como era de esperar. Es decir, ignora los archivos/carpetas que no comienzan con keepers. Pero sí quiero ignorar los archivos que comienzan con los guardianes.

Curiosamente, si cambio a esto:

^(?!keepers/).+\..+$ 

que coincidirá correctamente la carpeta, pero no va a ignorar los archivos que no están en los guardianes de carpetas si no tienen una extensión.

Cualquier consejo sería apreciado.

eliminación de enlace ImageShack muertos

Respuesta

7

El problema con su primera expresión es que la expresión regular también se prueba contra los "guardianes" a sí mismo. Ese caso se puede añadir con una condición adicional:

^(?!keepers(?:/|$)) 

o (menos compacta, pero más simple de entender):

^(?!keepers/|keepers$) 
+0

También probé '^ (?! guardianes \ b)', pero eso fallado contra "keepers.txt" – eswald

+0

Brilliant! Muchas gracias, ambos funcionaron perfectamente. He estado golpeándome la cabeza durante una hora :) –

+2

En una afirmación de anticipación no hay necesidad de grupos que no capturan, ya que no se captura de todos modos: '^ (?! keepers (/ | $)). *' – Tomalak

Cuestiones relacionadas