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?


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.


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

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

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.


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 .


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/**

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.




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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.