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 :)


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

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.


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/


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/

46
[Bb]in/

corresponde a maiúsculas e minúsculas


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.


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

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

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.


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 

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


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


2

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


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.


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

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.