2009-10-02 13 views
42

Necesito un archivo .hgdontignore :-) para incluir ciertos archivos y excluir todo lo demás en un directorio. Básicamente, quiero incluir solo los archivos .jar en un directorio particular y nada más. ¿Cómo puedo hacer esto? No soy tan hábil en la sintaxis de expresión regular. ¿O puedo hacerlo con sintaxis glob? (Prefiero que para la legibilidad)hgignore: ayudar a ignorar todos los archivos, excepto algunos

Simplemente como una ubicación de ejemplo, digamos que quiero excluir todos los archivos en foo/bar/ a excepción de foo/bar/*.jar.

Respuesta

36

Para ello, tendrá que utilizar esta expresión regular:

foo/bar/.+?\.(?!jar).+ 

Explicación

Usted está diciendo que lo que debe hacer caso omiso, por lo que esta expresión es la búsqueda de cosas que Don 't quiero.

  1. Se busca cualquier archivo cuyo nombre (incluyendo directorio relativo) incluye (foo/bar /)
  2. A continuación, busca los caracteres que preceden a un punto (. +? \. == partido de uno o más caracteres de cualquier momento hasta llegar al carácter de período)
  3. A continuación, asegúrese de que no tiene el final "jar" (?! jar) (Esto se conoce como una mirada negativa
  4. Finalmente toma el final tiene (. +)

Regular express Los iones son fáciles de estropear, por lo que le sugiero encarecidamente que obtenga una herramienta como Regex Buddy para ayudarlo a construirlos. Desglosará una expresión regular en inglés sencillo, lo que realmente ayuda.

EDITAR

Hey Jason S, Me has pillado, lo hace perder esos archivos.

Esta expresión regular corregido funcionará para todos los ejemplos se enumeran a continuación:

foo/bar/(?!.*\.jar$).+ 

Se encuentra:

  • foo/bar/baz.txt
  • foo/bar/baz
  • foo/bar/jar
  • foo/bar/baz.jar.txt
  • foo/bar/ba z.jar.
  • foo/bar/baz.
  • foo/bar/baz.txt.

pero no encuentra

  • foo/bar/baz.jar

Nueva Explicación

Esto dice buscar archivos en "foo/bar /", entonces no coinciden si hay cero o más caracteres seguidos de ".jar" y luego no hay más caracteres ($ significa el final de la línea), entonces, si ese no es el caso, haga coincidir los siguientes caracteres.

+0

whee! gracias, ahora voy a intentarlo. –

+1

hmm, buena idea, pero no funcionará como se indica, ya que no coincidirá con los archivos sin ninguna extensión. Pero creo que puedo transformarlo en lo que necesito. La parte 'foo/bar /' es fácil, así que olvidémonos de eso por el momento. Si puede solucionarlo, haga coincidir los archivos "baz.txt", "baz", "jar", "baz.jar.txt", "baz.jar.", "Baz." Y "baz.txt". " pero NO "baz.jar" entonces acepto. :-) –

+0

Hola Jason, entiendo a qué te refieres. Acabo de actualizar mi respuesta con una expresión regular de trabajo. Lo probé contra cada cadena que enumeró. –

41

La respuesta de Michael es una multa, pero otra opción es simplemente excluir:

foo/bar/** 

y luego agregar manualmente los archivos .jar. Siempre puede agregar archivos que están excluidos por una regla de ignorar y anula el ignorar. Solo tienes que recordar agregar los frascos que crees en el futuro.

+0

¿Cómo lo agregas manualmente? No se puede agregar con "hg add", ya que se usará el archivo de ignorar. Agregarlos con "hg add -I" falla, ya que aún se aplica el archivo de ignorar. Entonces, ¿cómo pueden agregarse anulando el archivo de ignorar? – Mecki

+3

Mecki, agregarlos con 'hg add' funciona bien; anula la ignorancia, siempre que no use comodines en su línea adicional. Así que coloca foo/bar/** en tu .hgignore y luego haz 'hg add foo/bar/path/specific.file' y listo. Si tiene muchas excepciones para agregar, puede canalizar 'hg status -u -n foo/bar/lots - *. Jar' a 'xargs hg add' y hacer sus anulaciones explícitas a granel. –

+1

y si alguien modificará foo/bar/path/specific.file, ¿aún se ignorará? no es una solución mate – holms

Cuestiones relacionadas