2010-07-14 12 views
5

Usando Mercurial, necesito ignorar todos los archivos y directorios, excepto los directorios "tests" y "languages" y los archivos en esos directorios. Que todos deben hacerse con expresiones regulares y .hgignoereMercurial .hgignore expresión regular

Archivos:

  • pruebas \ junk.txt
  • cms \ Ensayos \ some_file.txt
  • cms \ idiomas Users \ \ lang.txt
  • idiomas \ lang2.txt
  • tests.txt
  • proba/tests.txt

he intentado con esto:

^(?!test|test/|test$|languages|languages/|languages$) 

pero esto sólo coincide con los archivos que se inicia con la prueba y el lenguaje:

  • pruebas \ junk.txt
  • idiomas \ lang2.txt

Lo que quiero es que coincida también con

  • cms \ Ensayos \ some_file.txt
  • cms \ idiomas \ Users \ lang.txt

se agradecería cualquier consejo.

+0

Cambié mi respuesta, y ahora funcionará. – Omnifarious

Respuesta

2

Use globos, son más simples:

C:> dir 
tests languages pr0n espionage more_pr0n 

C:> type .hgignore 
syntax: glob 
pr0n/* 
espionage/* 
more_pr0n/* 

añadió: Si usted está preocupado de que no habrá nuevos directorios que no serán ignorados entonces usted debe:

hg add .hgignore 
hg commit 
echo "new_directory/*" >> .hgignore 
hg commit 

Si tiene demasiados directorios y archivos apareciendo en su directorio de origen para que este método funcione, cree un directorio de solo fuente.

+0

Me da la impresión de que está buscando una sugerencia que funcione incluso cuando haya nuevos directorios de nivel superior. –

+0

También tuve esa impresión, en cuyo caso la cura se agrega arriba. – msw

+0

Gracias por la respuesta rápida. Traté de poner esto en mi .hgignore: sintaxis: glob pruebas/* idiomas/* Pero esto es lo contrario de lo que quiero lograr. No quiero ignorar los archivos en esa carpeta. Quiero ignorar todos los archivos/carpetas que no son miembros de "pruebas" y "idiomas" – Danilo

2

No es la respuesta que está buscando pero casi nadie usa la sintaxis ?: de ancho negativo en sus archivos .hgignore. En los casos en que solo desean ignorar un pequeño subconjunto de todos los archivos, generalmente ignoran todo y luego hg add las excepciones: recuerde que en mercurial (a diferencia de cvs/svn) agregar un archivo anula ignorar.

Así que si su .hgignore Tendrías:

.* 

y luego se había hg add los archivos de las pruebas y los idiomas directorios explícitamente de 'hg add'. A continuación, debe recordar agregar nuevos archivos a medida que avanza, ya que todo se ignorará, pero si se supone que la mayoría de los archivos se ignorarán, la forma más fácil de hacerlo.

+0

A menudo no tengo claro si la pregunta debe responderse de acuerdo con las restricciones de la pregunta o si se debe abordar el problema raíz. Si es el último, esta respuesta es correcta y completa, pero no es buena. – msw

+0

Gracias Ray4an por la respuesta, pero esto es difícil de hacer todo el tiempo. Mi idea es ignorar todos los archivos que no están en las carpetas de pruebas e idiomas. ¿Sabes cómo puedo hacer esto? – Danilo

-1

No es posible.

Ver el manpage.

Por ejemplo, digamos que tenemos un archivo sin seguimiento , file.c, a/b/file.c dentro de nuestro repositorio . Mercurial ignorará file.c si algún patrón en .hgignore coincide con a/b/file.c, a/bo a.

Así que digamos que usted hace una expresión regular que no coincidirá con ninguna ruta que contiene test y el archivo proba/tests.txt está en el directorio de trabajo. Esa expresión regular se aplicará primero a proba y coincidirá, lo que dará como resultado que se ignore el archivo.

+0

En realidad es posible. Parte de la razón por la que te equivocas es que es posible anclar expresiones regulares para que solo coincidan al comienzo de la ruta. – Omnifarious

+0

Vas a tener que demostrarlo suministrando uno porque, hasta donde puedo imaginar, rooting o no debería importar. – hwiechers

+0

Lo siento, me perdí una parte importante de la pregunta. Tienes razón, no es posible. – Omnifarious

0

clave para resolver este es esta sección de la hgignore man page:

Por ejemplo, digamos que tenemos un archivo sin seguimiento, file.c, a/b/file.c dentro de nuestro repositorio. Mercurial ignorará file.c si algún patrón en .hgignore coincide con a/b/file.c, a/bo a.

Para ignorar todo menos un cierto conjunto de directorios, debemos ignorar cuidadosamente todo en cada nivel de la jerarquía de archivos. Supongamos que quiere ignorar todo excepto uno/dos/tres /, uno/dos/cuatro/y foo /. En primer lugar, ignorar todo menos uno/foo y /:

^(?!(one|foo)(/|$))

El ^ y (/|$) anclaje one|foo en el camino. A continuación, ignorar todo dentro de una/dos que no es /:

^one/(?!(two)(/|$))

Los paréntesis alrededor two están ahí para mantener la coherencia y no son necesarias. Y, por último ignorar todo en dos/que no es de tres/cuatro o /:

^one/two/(?!(three|four)(/|$))

Esto generaliza fácilmente a cualquier conjunto de directorios.