git игнорирует все файлы определенного типа, кроме тех, которые находятся в определенной подпапке

194

У меня есть структура каталогов, как это:

  • корень
    • folder1
      • abc.json
      • def.json
      • somedir
        • more.json
    • folder2
      • qwe.json
      • rty.json
    • спекуляция
      • mock1.json
      • mock2.json
      • somedir
        • more_mocks.json

Теперь с помощью .gitignoreя хочу игнорировать все *.jsonфайлы, кроме тех, что в spec. Я не хочу использовать .gitignorein, folder1и folder2потому что их множество, и они будут добавлены ко многим, и я уверен, что забуду переместить нужный .gitignoreфайл на место.

Кроме того, может быть больше вложенных каталогов с файлами json, и это правило необходимо применять также ко всем подкаталогам.

Итак, как мне игнорировать все файлы типа, кроме определенного подкаталога?

Алекс Уэйн
источник

Ответы:

304

Необязательный префикс, !который отменяет шаблон; любой соответствующий файл, исключенный предыдущим шаблоном, снова будет включен. Если шаблон с отрицанием соответствует, это переопределит источники шаблонов с более низким приоритетом.

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

*.json
!spec/*.json
янтарный
источник
4
Вы также можете добавить .gitignore в спецификацию, содержащую! / *. Json, если хотите.
Дэвид Митчелл
2
Спасибо! Хотя в моем случае я понял, что хочу вообще ничего не игнорировать в моей директории спецификаций. Так что я могу сойти с рук очень просто !spec. Работает как шарм.
Алекс Уэйн
7
Хотя ответ Амбер работает, когда spec является каталогом верхнего уровня (т.е. / spec), он не работает для меня, когда spec является подкаталогом, например, / a / spec или a / b / spec. Использование git 1.7.5.4
Питер Льюис
7
@PeterLewis (для будущих посетителей): такой случай может быть обработан путем создания файла .gitignore в соответствующем подкаталоге.
cmbuckley
3
Это решение для меня игнорировало только jsonфайлы specнапрямую, а не тот, что в somedirподкаталоге из вопроса. Мне нужно было использовать !spec/**/*.jsonдля того, чтобы убедиться, что more_mocks.jsonбыло совершено.
Лейт