Como digo ao Git para ignorar tudo, exceto um subdiretório?

218

Eu quero ignorar todos os arquivos no meu repositório, exceto aqueles que ocorrem no binsubdiretório. Tentei adicionar o seguinte ao meu .gitignore:

*
!bin/*

No entanto, isso não tem o efeito desejado: criei um novo arquivo dentro de bin/, mas git statusainda assim mostro nothing to commit (working directory clean).

Alguma sugestão?

Michael Goerz
fonte

Respostas:

273

Isso ignora os arquivos raiz e os diretórios raiz, e então ignora o diretório da caixa raiz:

/*
/*/
!/bin/

Dessa forma, você obtém todo o diretório bin, incluindo subdiretórios e seus arquivos.

Tyler Laing
fonte
25
Por alguma razão, isso não funciona consistentemente para mim. Eu tenho as duas linhas /stuff/e !/stuff/specific/, mas ele ainda ignora / stuff / specific /
LB-- 18/11/2013
1
@ LB-- eu tive um problema semelhante, e git check-ignore -vme disseram que era por causa de~/.gitignore
maca alex
@ gurneyalex Eu descobri que ele se corrige se eu excluir o repositório local e cloná-lo novamente, deve ser um bug.
LB--
2
O / * / é necessário?
Alex Baker
3
Isso não funcionou para mim. Eu tive que adicionar !/bin/ao meu .gitignorearquivo raiz , mas também tive que adicionar um /bin/.gitignorearquivo com !*... Fazer apenas uma dessas alterações não funcionou. Só funcionou depois de combinar as duas alterações.
Felipe Brahm
113

Aqui, como ignorar tudo, exceto um diretório " MY_SUPER_DUPER_TEMPLATE_directory " em algum diretório

Estrutura: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Andrii Tishchenko
fonte
1
Isso fez maravilhas por cancelar a assinatura de um pacote de laravel que eu havia modificado! Obrigado, você me salvou muitas dores de cabeça
Maria Vilaró
Isso deve ser selecionado como a melhor resposta.
Bahman.A
63

Você deve excluir tudo no caminho para os destinos, mas deve incluir os destinos:

Nota: Este é um arquivo de exclusão (por exemplo, .gitignore), portanto a lógica é invertida. Ignorar tudo, exceto o diretório tsp, ignorar tudo no diretório tsp, exceto o diretório src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
fonte
11
+1 pelo princípio de incluir um diretório, excluir seu conteúdo e incluir o subdiretório desejado etc. Acabei usando essa resposta em meus projetos.
João Jesus
40

O único problema que você tem é que o bindiretório em si não é correspondido pelo bin/*padrão, de modo que o git nem sequer olha no bindiretório.

Existem duas soluções que vêm à mente.

.gitignore :

*
!/bin/
!bin/*

ou

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Prefiro a segunda solução, pois a primeira solução não para de ignorar os arquivos no bindiretório que estão em subdiretórios que não são chamados bin. Isso pode ou não ser importante na sua situação.

CB Bailey
fonte
2
Não funcionou para mim. Eu tenho que ter um .gitignore como este para fazê-lo funcionar: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* nenhum código de bloco nos comentários?
Xlttj
1
A resposta de Tyler tem solução arquivo melhor único
Yarin
19

No documento oficial do git , um dos exemplos diz:

Exemplo para excluir tudo, exceto um diretório específico foo / bar (observe o / * - sem a barra, o curinga também excluiria tudo dentro de foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Para obter uma explicação sobre a barra inicial: Quando usar a barra inicial no gitignore .

solstice333
fonte
Obrigado um milhão, isso funcionou para mim! Observe para outras pessoas que a ordem das linhas aqui é importante, você não pode ter! / Foo / bar antes de / foo / * por exemplo.
Iamsodarncool
13

Tente seguir a versão mais recente do GIT.

*
!*/
!/path/to/your/dir/**
Kirby
fonte
ele deve realmente ser / path / to / your / dir / ** para a última linha!
faham
@faham, sim, acabei de adicionar.
Kirby
11

Eu acho que uma maneira melhor seria ancorar cada padrão no diretório git superior iniciando o padrão com uma barra:

/*
!/public_html
!/.gitignore

Em vez de ignorar todos os arquivos, ele ignora apenas os arquivos de nível superior, não os do diretório que você não deseja ignorar.

Jake
fonte
8

Isso .gitignorefunciona para mim:

*/
/*
!bin/
Trianam
fonte
5

tente este bug obscuro do git.

!bin**/**

Espero que ajude :)

Amostra de bug do git de documentos do suporte

PS: tente primeiro antes de comentar.

david
fonte
0

Eu tive que fazer isso recentemente:

*
!sub-dir/
!sub-dir/*

Não sei por que preciso de duas linhas para excluir uma pasta, mas é isso que funcionou para mim e macos.

Henry
fonte