git ignorar exceção

326

Eu tenho um arquivo gitignore que faz o git ignorar *.dllarquivos, e esse é realmente o comportamento que eu quero. No entanto, se eu quiser uma exceção (ou seja, poder confirmar foo.dll), como posso conseguir isso?

roundcrisis
fonte
8
possível duplicata de exceções em .gitignore
wallyk
fwiw, o avô de respostas duplicadas sobre esse tópico - um que você deve examinar - provavelmente seria Make .gitignore ignorar tudo, exceto alguns arquivos - atividade muito regular e várias boas respostas. Eu sou particularmente fã desta resposta , que parece clara e completa.
Kay V

Respostas:

447

Usar:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

Do gitignore :

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.

Skilldrick
fonte
22
Veja também formulário de resposta @Matiss Jurgelis - é importante complemento
Dan
7
Posso adicionar a exceção ao gitignore do meu projeto e não ao gitignore global? Por exemplo, se eu quisesse incluir todas as DLLs em um diretório? Meu gitignore_global está *.dllnele, e o gitignore do meu projeto tem, !Libs/*.dllmas isso não parece estar funcionando.
Joel Kinzel #
1
@ jkinz, você deve tentar !Libs/**/*.dll.
Rosberg Linhares
@RosbergLinhares Ou !**/Libs/*.dll, dependendo da estrutura da pasta.
JAB
2
Obrigado, mas em um mac, adicionar o comentário na mesma linha !foo.dllque invalidou o comando. Se eu adicionar o comentário em uma linha separada, ele funcionará.
Giacomo
261

Git ignora pastas se você escrever:

/js

mas não pode adicionar exceções se você fizer: !/js/jqueryou !/js/jquery/ou!/js/jquery/*

Você deve escrever:

/js/* 

e só então você pode, exceto subpastas como esta

!/js/jquery
Matiss
fonte
44
Isso é muito importante. Obrigado!
VisioN 10/10
3
No entanto parece que você não pode adicionar pastas aninhadas, por exemplo, !/js/jquery/xyzlibnão será ignorado ...
Ignorante
2
Como o @Ignorant diz, a pasta que você "exceto" da regra de ignorar deve estar no mesmo local que o "*"
The Red Pea
3
por isso /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Parece uma maneira bastante engraçada de fazê-lo ... #
Imperishable Night 23/11
você realmente me ajudou.
Loyea 24/03/19
55

Você pode simplesmente git add -f path/to/foo.dll.

.gitignore ignora apenas arquivos para rastreamento usual e coisas como git add .

Nils Riedemann
fonte
4
Apenas para obter mais detalhes, o -fdiz git para forçar a adição deste arquivo no repo uma vez que pode ignorá-lo primeiro por causa de sua.gitignore
RPDeshaies
Que é ótimo se você tiver apenas um arquivo, menos útil se você precisar de um padrão
Liam
19

Para excluir tudo em um diretório, mas alguns subdiretórios, faça o seguinte:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Fonte: https://gist.github.com/444295

Simon Paarlberg
fonte
15

Basta adicionar ! antes de uma regra de exclusão.

De acordo com a página de manual do gitignore :

Os padrões têm o seguinte formato:

...

  • 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.
Robert Munteanu
fonte
5

!foo.dll em .gitignore, ou (sempre!) git add -f foo.dll

Tobias Kienzler
fonte
4

Se você estiver trabalhando com o Visual Studio e a sua .dll estiver em uma binpasta, será necessário adicionar uma exceção para a própria pasta bin, antes de poder adicionar a exceção para o arquivo .dll. Por exemplo

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Isso ocorre porque o .gitignorearquivo padrão do Visual Studio inclui um padrão de ignorado para[Bbin]/

Esse padrão está zapeando todas as pastas da lixeira (e, consequentemente, seu conteúdo), o que faz com que qualquer tentativa de incluir o conteúdo seja redundante (uma vez que a própria pasta já foi ignorada).

Consegui descobrir por que meu arquivo não estava sendo excedido executando

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

a partir de uma janela do Git Bash. Isso retornou o [Bbin]/padrão.

DeanOC
fonte
2

A solução depende da relação entre a regra de ignorar git e a regra de exceção:

  1. Arquivos / arquivos no mesmo nível: use a solução @Skilldrick .
  2. Pastas / subpastas: use a solução @Matiss Jurgelis .
  3. Arquivos / Arquivos em diferentes níveis ou Arquivos / Subpastas: você pode fazer isso:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    
Rosberg Linhares
fonte
1

Desde o Git 2.7.0, o Git leva em consideração as exceções. Das notas oficiais de lançamento:

  • Permita que um "! / Abc / def" posterior substitua um "/ abc" anterior que apareça no mesmo arquivo .gitignore para facilitar a expressão "tudo no diretório / abc é ignorado, exceto ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

Erfan
fonte
1
isso funciona para alguém? parece não funcionar para mim.
Ankur