git ignora todos os arquivos de um determinado tipo, exceto aqueles em uma subpasta específica

192

Eu tenho uma estrutura de diretórios como esta:

  • raiz
    • folder1
      • abc.json
      • def.json
      • somedir
        • more.json
    • folder2
      • qwe.json
      • rty.json
    • especificação
      • mock1.json
      • mock2.json
      • somedir
        • more_mocks.json

Agora, usando um .gitignoreeu quero ignorar todos os *.jsonarquivos, exceto os do spec. Eu não quero usar um .gitignoredentro folder1e folder2porque há uma tonelada deles e eles serão adicionados a muitos, e tenho certeza que vou esquecer de mover o .gitignorearquivo certo no lugar.

Além disso, pode haver mais diretórios aninhados com arquivos json, e essa regra também se aplica a todos os subdiretórios.

Então, como ignoro todos os arquivos de um tipo, exceto um determinado subdiretório?

Alex Wayne
fonte

Respostas:

302

Um prefixo opcional !que nega o padrão; qualquer arquivo correspondente excluído por um padrão anterior será incluído novamente. Se um padrão negado corresponder, isso substituirá as origens de padrões de precedência mais baixa.

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

*.json
!spec/*.json
Âmbar
fonte
4
Você também pode adicionar um .gitignore à especificação que contém! / *. Json, se preferir.
David Mitchell
2
Obrigado! Embora, no meu caso, percebi que não quero ignorar nada no meu diretório de especificações. Então, eu sou capaz de fugir com um muito simples !spec. Funciona como um encanto.
Alex Wayne
7
Enquanto a resposta de Amber funciona quando spec é um diretório no nível superior (por exemplo, / spec), não funciona para mim quando spec é um subdiretório, por exemplo, / a / spec ou a / b / spec. Usando git 1.7.5.4
Peter Lewis
7
@ PeterLewis (para futuros visitantes): esse caso pode ser tratado com a criação de um arquivo .gitignore no subdiretório relevante.
Cmbuckley
3
Esta solução para mim apenas ignorou os jsonarquivos specdiretamente, e não o somedirsubdiretório da pergunta. Eu precisava usar !spec/**/*.jsonpara ter certeza de que o mesmo more_mocks.jsonfoi cometido.
Leith