ignorando qualquer diretório 'bin' em um projeto git

1236

Eu tenho uma estrutura de diretórios como esta:

.git/
.gitignore
main/
  ...
tools/
  ...
...

Dentro do main e tools, e qualquer outro diretório, em qualquer nível, pode haver um diretório 'bin' que eu quero ignorar (e também quero ignorar tudo nele). Eu tentei cada um desses padrões no .gitignore, mas nenhum deles funciona:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Alguém pode me ajudar? O primeiro padrão (o que eu acho que deveria estar funcionando) funciona muito bem se eu fizer isso:

/main/**/bin/**/*

Mas não quero ter uma entrada para todos os diretórios de nível superior e não preciso modificar .gitignore toda vez que adiciono um novo.

Este é no Windows usando o mais recente msysgit.

EDIT: mais uma coisa, existem arquivos e diretórios que possuem a subcadeia 'bin' em seus nomes, não quero que eles sejam ignorados :)

Ben Hymers
fonte
14
Provavelmente alguém achará útil: se você tiver poucos repositórios e cada um tiver o mesmo arquivo .gitignore, poderá colocá-lo no local "comum" e iniciar> git config --global core.excludesfile ~ / .gitignore_global O último parâmetro é path para o local comum. PS: Eu sou novo no git e não tenho certeza se essa é a recomendação de "melhores práticas". Então, por favor me avise se você não quiser fazer isso. Obrigado.
Budda 28/11
A **sintaxe parece agora (março de 2013, git 1.8.2) oficialmente documentado: ver minha resposta abaixo
VonC
2
Se alguém quiser ler a versão mais atualizada da página de manual atual, consulte Página de manual do gitignore (5) .
opção mais amigável se você está cansado de ler ensaios para informações de uma linha atlassian.com/git/tutorials/saving-changes/…
suazithustra

Respostas:

1834

Antes da versão 1.8.2, **não havia nenhum significado especial no .gitignore. A partir da versão 1.8.2, o git suporta **zero ou mais subdiretórios (consulte as notas da versão ).

A maneira de ignorar todos os diretórios chamados bin em qualquer lugar abaixo do nível atual em uma árvore de diretórios é com um .gitignorearquivo com o padrão:

bin/

Na manpágina, há um exemplo de ignorar um diretório chamado foousando um padrão análogo.

Editar: se você já possui pastas bin no seu índice git que não deseja mais acompanhar, é necessário removê-las explicitamente. O Git não para de rastrear caminhos que já estão sendo rastreados apenas porque agora correspondem a um novo .gitignorepadrão. Execute uma pasta remover ( rm ) apenas do índice ( --cached ) recursivamente ( -r ). Exemplo de linha de comando para a pasta na lixeira raiz:

git rm -r --cached bin
CB Bailey
fonte
72
Começando com git 1.8.2, git vai aceitar **em .gitignorearquivos (fonte: 1.8.2 changelog )
Carlos Campderrós
15
é bino mesmo de bin/?
Nisba
29
@Nisba, eles são diferentes, binirá ignorar arquivos chamados bin, enquanto bin/é para diretórios chamado bin
Rani Kheir
8
desde que caiu sobre isto: nome da pasta em git-comando é sensível a maiúsculas :) "bin = Bin!" - talvez eu reposição alguém a poucos minutos de esta dica :)
dba
1
No Windows 10 não é possível criar um arquivo .gitignore, você tem que criar um gitignore.txt e depois executar ren gitignore.txt .gitignore no prompt de comando para criar este arquivo
gasto
463

O .gitignoredo seu sonho parece ser:

bin/

no nível superior.

Michael Krelin - hacker
fonte
Muito obrigado por sua ajuda, apenas não se esqueça de verificar o exemplo de arquivos ignorados: git checkout bin *
Chris Sim
1
coloque-o em gitignore_global
Augολὼν.λαβέ
@GAlexander, por que alguém iria querer ignorar globalmente bin / diretórios? Eles costumam ter conteúdo com versão. E a ignorância global não afetará outros usuários do repositório.
Michael Krelin - hacker de
234

Eu acho que vale a pena mencionar para iniciantes do git:

Se você já possui um arquivo registrado e deseja ignorá-lo, Git não o ignorará se você adicionar uma regra posteriormente . Nesses casos, você deve rastrear o arquivo primeiro, executando o seguinte comando no seu terminal:

git rm --cached

Portanto, se você deseja adicionar para ignorar alguns diretórios em seu repositório local (que já existem) após a edição de .gitignore, você deseja executá-lo no diretório raiz

git rm --cached -r .
git add .

Basicamente, 'atualiza' seu repositório local e desinstala os arquivos ignorados.

Vejo:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/

plancys
fonte
se eu costumo fazer um git add -Aem meus commits, posso usar isso? e também posso substituir o ponto por -A na primeira linha?
Ajax333221 de
69

O **nunca funcionou corretamente antes, mas desde o git 1.8.2 (8 de março de 2013) , parece ser explicitamente mencionado e suportado:

Os padrões .gitignoree .gitattributesarquivos podem ter **/, como um padrão que corresponde a 0 ou mais níveis de subdiretório .

Por exemplo, " foo/**/bar" corresponde " bar" a " " em foosi ou em um subdiretório " foo".

No seu caso, isso significa que agora esta linha pode ser suportada:

/main/**/bin/
VonC
fonte
46
[Bb]in/

corresponde a maiúsculas e minúsculas

wisbucky
fonte
2
[B]in/ser a única maiúsculas
Gank
Como deixar apenas a Binpasta ignorar e binconfirmar o git? [B]in/irá cometer Bine bin.
Gank
4
Isso deve ser feito, @ Gank: Bin/ !bin/
Marco G
34

Não o vi mencionado aqui, mas isso parece fazer distinção entre maiúsculas e minúsculas. Depois que mudei para / Bin, os arquivos foram ignorados conforme o esperado.

Cory
fonte
3
Esta não é uma resposta para a pergunta original que foi explicitamente sobre bin, não Bin.
CB Bailey
49
Embora não seja uma resposta, ela contribui para a integridade de outras pessoas que pesquisam o mesmo problema (eu mesmo, agora).
Jay
25

[Bb]in resolverá o problema, mas ... Aqui está uma lista mais extensa de coisas que você deve ignorar (lista de exemplo do GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Jaider
fonte
3
Nota: Coisas como essa devem estar no seu gitignore GLOBAL (geralmente no diretório inicial.) O gitignore do projeto deve ignorar apenas coisas específicas do seu projeto (por exemplo, arquivos .o para um aplicativo C.)
BraveNewCurrency
18

Se você está procurando um ótimo .gitignorearquivo global para qualquer solução do Visual Studio (.NET) - recomendo que você use este: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK tem o mais abrangente .gitignorepara projetos .NET.

Jochen van Wylick
fonte
5
Isso realmente não responde à pergunta, mas é exatamente o que eu estava procurando.
Dave
18

Etapa 1: adicione o seguinte conteúdo ao arquivo .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Etapa 2: certifique-se de ter efeito

Se o problema persistir, é porque as configurações em .gitignore podem ignorar apenas arquivos que originalmente não foram rastreados . Se alguns arquivos já foram incluídos no sistema de controle de versão, a modificação de .gitignore é inválida. Para resolver esse problema completamente, é necessário abrir o Git Bash ou o Console do Gerenciador de Pacotes (veja a captura de tela abaixo) para executar os seguintes comandos na pasta raiz do repositório.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

Console PM Em seguida, o problema será completamente resolvido.

Bravo Yeung
fonte
8

Literalmente, nenhuma das respostas realmente funcionou para mim; o único que funcionou para mim foi (no Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
AnthonyC
fonte
Isso ignorou todas as pastas nomeadas binnos subdiretórios também?
vineeshvs
5

Como um aviso;

Se você pensar .gitignoreque não funciona de uma maneira ( foo/*pasta adicionada a ela, mas git statusainda mostrando o conteúdo da pasta como modificado ou algo parecido com isso), use este comando;

git checkout -- foo/*

K-Gun
fonte
3

para a versão 2.13.3 em diante, escrever apenas bin no seu arquivo .gitignore deve ignorar o bin e todos os seus subdiretórios e arquivos

bin

Nikhil Karanjkar
fonte
2

Adicionar ** / bin / ao arquivo .gitignore fez o truque para mim (Nota: a pasta bin não foi adicionada ao índice).

Dhwaneel
fonte
1

Se o padrão dentro .gitignoreterminar com uma barra/ , ele encontrará apenas uma correspondência com um diretório.

Em outras palavras, bin/corresponderá a um diretório bine caminhos abaixo dele, mas não corresponderá a um arquivo regular ou a um link simbólico bin.


Se o padrão não contém uma barra , como no binGit, trata-o como um padrão de globos de casca (ganancioso). Então, o melhor seria usar simples /bin.

bin não seria a melhor solução para esse problema em particular.

prosti
fonte
Você quis dizer 'começar com' a /?
vineeshvs
0

No meu caso, a codificação do arquivo gitignore era problemática, verifique se é UTF-8

Jacek Plesnar
fonte