Pregunta

Estoy convirtiendo mi repositorio mercurial en GIT. Parte del sistema de archivos se ve así:

|-- .gitignore
|-- .hgignore
`-- var
    |-- .dummy
    |-- asdf
    `-- log
        |-- .dummy
        `-- asdf

Mi archivo .hgignore usa expresiones regulares. Parte de mi archivo .hgignore es el siguiente:

^var/(?!\log|.dummy)
^var/log/(?!\.dummy)

Quiero rastrear el .dummy archivos pero no el asdf archivos. hg status devoluciones:

? var/.dummy
? var/log/.dummy

¿Cómo puedo obtener el mismo efecto en .gitignore? He probado lo siguiente:

/var/**/*
!/var/.dummy
!/var/log/.dummy

Pero esto no ignorará var/asdf como se desee. ¿Cómo puedo rastrear? var/.dummy y var/log/.dummy e ignorar var/asdf y var/log/asdf?

¿Fue útil?

Solución

Si solo está usando el .dummy Archivos como marcadores de posición para asegurarse de que siempre obtenga esos directorios particulares (casi vacíos) cuando realice un pago limpio, entonces probablemente debería excluir /var y use git add -f var/.dummy var/log/.dummy Para comenzar a rastrear explícitamente los archivos de marcador de posición. El resultado efectivo es que ignorará todo excepto el .dummy archivos que rastreaste explícitamente.

Por otro lado, si planea expandir la jerarquía de directorios casi vacíos más allá de var/log, entonces es posible que pueda usar un poco de explicación.

Las reglas se describen en Gitignore (5), pero a veces es difícil dar sentido a todas las reglas y cómo interactúan. La parte importante es que la última regla gana, y que las reglas posteriores solo pueden ser efectivas si los directorios en los que actúan ya no se ignoran por completo. Esto significa que si ha ignorado los directorios, debe designarlos antes de que pueda uniformar un poco de sus contenidos (mientras vuelve a confiar el resto de sus contenidos).


Si quieres ignorar automáticamente todo excepto .dummy archivos debajo var, entonces la forma más simple de hacer esto implica poner un .gitignore Archivo en su var directorio en lugar de hacerlo en el nivel superior. Describí esta solución en otra Pues contesta.

# var/.gitignore
*
!/.gitignore
!.dummy
!*/
  1. Ignorar todo en este directorio (var).
  2. Pero, no ignore este archivo .Gitignore (puede dejar esto si está dispuesto a hacer git add -f para comenzar a rastrear esto .gitignore expediente).
  3. Además, no ignore .dummy archivos a cualquier profundidad en la jerarquía enraizada en este directorio (var).
  4. Además, no ignore ningún director de ninguna profundidad bajo este directorio (var).
    Sin esta regla, la primera regla ignorará los subdirectorios y Git nunca los abriría para buscar .dummy archivos.

Los dos últimos patrones son "recursivos" porque no tienen una barra no en trama (lo que significa que * coincidirá con las bases además de otros personajes). Una barra de corte posterior hace que el patrón coincida solo con directorios. Las cortes principales e incrustadas anclan efectivamente el patrón a la ubicación del .gitignore Archivo (o la raíz del repositorio de patrones de otros archivos de exclusión). La idea es que una llanura *.o debería coincidir en cualquier lugar, pero dir/*.o solo debe coincidir con los elementos directamente debajo dir (y podemos usar /*.o Para este último efecto en dir/.gitignore).


Si no puedes tolerar un var/.gitinore Archivo, entonces aún puede hacer lo que le pidió, pero no puede "unignore" automáticamente nuevo .dummy Archivos en cualquier lugar debajo var sin editar los patrones de exclusión.

# .gitignore at root of repository
/var/*
!/var/.dummy

!/var/log/
/var/log/*
!/var/log/.dummy
  1. Ignora todo bajo el var directorio que es un hermano de este .gitignore expediente.
  2. Pero, no ignore el var/.dummy.
  3. Además, no ignore el directorio var/log.
  4. Pero, ignora todo directamente en var/log.
  5. Pero, no ignore var/log/.dummy.

El patrón es: Unignore un directorio interesante (omita esto la primera vez, ya que todo está "unigorado" de forma predeterminada), ignore lo que hay en el directorio, unifree el .dummy Archivo en él. Repita el patrón para cada parte más profunda de la jerarquía.

Puedes reemplazar log con * para que funcione para cualquier directorio directamente debajo var, pero no funcionará automáticamente para directorios que sean más profundos (por ejemplo, funcionaría para var/cache/.dummy, pero no para var/log/ssh/.dummy). Esto se debe a que estamos utilizando cortes no en tracción y anclamos los patrones. Para que funcione manualmente, debe repetir el patrón para generar más reglas de exclusión para las partes más profundas (DIR interesante de Unignore, ignorar el contenido de Dir, Unignore File).

Otros consejos

No necesitas excluir .dummy con regex. Simplemente ignore todo y agregue manualmente y luego todos sus .dummy.

Ignorar los afectos solo en el resultado del comando de estado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top