git ignoruje wszystkie pliki określonego typu, z wyjątkiem plików w określonym podfolderze

193

Mam taką strukturę katalogów:

  • korzeń
    • folder 1
      • abc.json
      • def.json
      • somedir
        • more.json
    • folder2
      • qwe.json
      • rty.json
    • spec
      • mock1.json
      • mock2.json
      • somedir
        • more_mocks.json

Teraz za pomocą a .gitignorechcę zignorować wszystkie *.jsonpliki oprócz tych w spec. Nie chcę, aby użyć .gitignorew folder1a folder2ponieważ istnieje mnóstwo z nich i będą dodawane do wielu, i jestem pewien, że nie zapomnę, aby przesunąć w prawo .gitignoreplik na swoim miejscu.

Ponadto może istnieć więcej zagnieżdżonych katalogów z plikami json i ta reguła musi mieć zastosowanie również do wszystkich podkatalogów.

Jak więc zignorować wszystkie pliki danego typu, z wyjątkiem pewnego podkatalogu?

Alex Wayne
źródło

Odpowiedzi:

303

Opcjonalny przedrostek, !który neguje wzór; każdy pasujący plik wykluczony przez poprzedni wzór zostanie ponownie dołączony. Jeśli negowany wzorzec pasuje, zastąpi to źródła wzorców o niższym priorytecie.

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

*.json
!spec/*.json
Bursztyn
źródło
4
Możesz również dodać .gitignore do specyfikacji, która zawiera! / *. Json, jeśli wolisz.
David Mitchell,
2
Dzięki! Chociaż w moim przypadku zdałem sobie sprawę, że w ogóle nie chcę nic ignorować w katalogu spec. Więc jestem w stanie uciec z bardzo prostym !spec. Działa jak marzenie.
Alex Wayne
7
Chociaż odpowiedź Amber działa, gdy spec jest katalogiem na najwyższym poziomie (tj. / Spec), nie działa dla mnie, gdy spec jest podkatalogiem, np. / A / spec lub a / b / spec. Korzystanie z git 1.7.5.4
Peter Lewis,
7
@PeterLewis (dla przyszłych użytkowników): taki przypadek można rozwiązać, tworząc plik .gitignore w odpowiednim podkatalogu.
cmbuckley
3
To rozwiązanie dla mnie zignorowało tylko jsonpliki specbezpośrednio, a nie ten w somedirpodkatalogu z pytania. Musiałem użyć !spec/**/*.json, aby upewnić się, że również more_mocks.jsonzostał popełniony.
Leith,