2010-09-03 17 views
13

Estoy administrando $ HOME usando Mercurial, para mantener mis archivos dot y rastreados, o al menos los que me importan.¿Cómo puedo ignorar todos los directorios, excepto uno que utiliza .hgignorar?

Sin embargo, hay una profusión de archivos y directorios en ~ que no necesitan ser rastreados, y ese conjunto es cambiante y en constante crecimiento.

Históricamente, he tratado con esto teniendo presente .hgignore:

syntax: glob 
* 

Esto mantiene mi estado limpio, como lo que le pasa, por lo que antes sólo los archivos visibles seguimiento. Sin embargo, tengo algunos directorios (en mi caso, scripts, .emacs.d) en los que me gustaría ver archivos sin seguimiento; Casi siempre quiero rastrear nuevas adiciones a esos directorios.

Sé que puedo ejecutar hg st -u scripts para identificar archivos sin seguimiento, pero quiero un medio por el cual pueda lograr la misma función usando el estado simple de hg ole.

¿Hay alguna manera de hacerlo?

Respuesta

17

Prueba esto en .hgignore lugar:

syntax: regexp 

^(?!(scripts|foo|bar)/)[^/]+/ 
  • ^ partidos comienzo del camino
  • (?!(scripts|foo|bar) utiliza búsqueda negativa hacia delante para ignorar todos los archivos excepto aquellos en los directorios scripts, foo o bar
  • /) asegura que los directorios que tienen un directorio rastreado como prefijo se ignoran
  • [^/]+/ luego en realidad coincide con cualquier directorio (con exclusión de los descartada por la búsqueda hacia delante), por lo que los archivos de ~ no se tienen en cuenta

de crédito a la idea central de esta solución (la búsqueda negativa hacia delante) va a Michael La La respuesta de Voie a this question

+0

Esto es una gran solución, pero todos los archivos en ~ todavía se muestran, lo que es al menos_ tan ruidoso. No realizo un seguimiento de todos los archivos dot (no menos importante porque muchos paquetes insisten en colocarlos en mi ~ directorio). –

+1

A menos que pueda usar patrones de nombre de archivo para distinguir archivos punto (para ignorar) de los directorios (no debe ignorarlos), creo que no tiene suerte. Los documentos Mercurial dicen que si una ruta 'a/b/c' no puede coincidir con un patrón' .hgignore', se intenta el mismo patrón frente a 'a/b' y, si eso falla,' a'. Por lo tanto, los archivos y directorios en la raíz solo se pueden distinguir por la forma en que se escriben. Si solo unos pocos directorios rastreados comienzan con un punto, entonces puede agregarlos manualmente y '.hgignore' todo lo demás comenzando con uno. – shambulator

8

Esta pregunta ha sido solicitada aquí en SO unas cuantas veces, y obtendrá muchas respuestas intrincadas utilizando aserciones negativas de mirada de ancho cero, un truco de expresiones regulares maltratado, pero las mejores soluciones son para (a) simplemente hacer el repositorio en ese directorio solo o (b) simplemente agregar los archivos en ese directorio. Para la opción (b), simplemente pondría .* en su archivo .hgignore para ignorar todo, y luego manualmente hg add los archivos que desea rastrear. En mercurial, a diferencia de svn y cvs, puede anular un ignorar con un complemento.

+0

La creación del repositorio en ese directorio no rastrea los archivos en la raíz, o deja abierta la opción de rastrear otros directorios en el mismo repositorio.¿Qué hay de malo con usar lookahead? – shambulator

+0

No pasa nada, es complicado y rara vez se hace. La mayoría de las personas simplemente 'hg add' las excepciones e ignoran todo si lo desean .Hgignore era una lista blanca en lugar de la lista negra que es. –

+0

Justo lo suficiente - No voy a negar que tomó un par de intentos para obtener la expresión regular correcta, y eso es suponiendo que no me he perdido un caso de esquina :) ¡Sin embargo, cada uno que obtenga correctamente lo ayudará con el siguiente! Y de esta manera, solo tienes que usar 'hg status' y' hg addremove'. – shambulator

Cuestiones relacionadas