git ignora todos los archivos de cierto tipo, excepto aquellos en una subcarpeta específica

192

Tengo una estructura de directorios como esta:

  • raíz
    • carpeta1
      • abc.json
      • def.json
      • somedir
        • more.json
    • carpeta2
      • qwe.json
      • rty.json
    • Especificaciones
      • mock1.json
      • mock2.json
      • somedir
        • more_mocks.json

Ahora usando un .gitignoreQuiero ignorar todos los *.jsonarchivos excepto los que están en el spec. No quiero usar un .gitignorein folder1y folder2porque hay un montón de estos y se agregarán a muchos, y estoy seguro de que olvidaré mover el .gitignorearchivo correcto en su lugar.

Además, puede haber más directorios anidados con archivos json, y esta regla también debe aplicarse a todos los subdirectorios.

Entonces, ¿cómo ignoro todos los archivos de un tipo, excepto un cierto subdirectorio?

Alex Wayne
fuente

Respuestas:

302

Un prefijo opcional !que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se volverá a incluir. Si un patrón negado coincide, esto anulará las fuentes de patrones de precedencia inferior.

http://schacon.github.com/git/gitignore.html

*.json
!spec/*.json
Ámbar
fuente
44
También puede agregar un .gitignore a la especificación que contiene! / *. Json, si lo prefiere.
David Mitchell
2
¡Gracias! Aunque en mi caso, me di cuenta de que no quiero ignorar nada en mi directorio de especificaciones. Así que puedo salir con una muy simple !spec. Funciona de maravilla.
Alex Wayne
77
Si bien la respuesta de Amber funciona cuando spec es un directorio en el nivel superior (es decir, / spec), no funciona para mí cuando spec es un subdirectorio, por ejemplo / a / spec o a / b / spec. Usando git 1.7.5.4
Peter Lewis
77
@PeterLewis (para futuros visitantes): tal caso puede manejarse creando un archivo .gitignore en el subdirectorio correspondiente.
cmbuckley
3
Esta solución para mí solo ignoró los jsonarchivos specdirectamente, no el que está en el somedirsubdirectorio de la pregunta. Necesitaba usar !spec/**/*.jsonpara asegurarme de que también more_mocks.jsonestaba comprometido.
Leith