Qual é a diferença entre o Git ignorar o diretório e o diretório / *?


108

Estou confuso sobre qual é a maneira correta de ignorar o conteúdo de um diretório no git.

Suponha que eu tenha a seguinte estrutura de diretório:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

Qual é a diferença entre colocar isso:

www

E isto?

www/*

A razão pela qual estou fazendo esta pergunta é: No git, se um diretório estiver vazio, o git não incluirá esse diretório vazio no repositório. Então, eu estava tentando a solução que é adicionar um arquivo .gitkeep extra no diretório para que ele não fique vazio. Quando estava tentando essa solução, se no arquivo .gitignore, eu escrevia assim:

www
!*.gitkeep

Não funciona (minha intenção é ignorar todos os conteúdos em www, mas manter o diretório). Mas se eu tentar o seguinte:

www/* 
!*.gitkeep

Então funciona! Portanto, acho que deve haver algumas diferenças entre as duas abordagens.


Uma diferença simples entre bine bin/é que o primeiro irá ignorar arquivos ou pastas, o último apenas as pastas. Eu não sei a diferença combin/*
Coronel Panic

Respostas:


203

Existem diferenças entre www, www/e www/*.

Basicamente, a partir da documentação e meus próprios testes, wwwencontrar uma correspondência com um arquivo ou diretório, www/apenas corresponde a um diretório, enquanto www/*combina diretórios e arquivos dentro www.

Vou apenas discutir as diferenças entre www/e www/*aqui, já que as diferenças entre wwwe www/são óbvias.

Pois www/, git ignora o wwwpróprio diretório , o que significa que o git nem vai olhar dentro. Mas para www/*, git verifica todos os arquivos / pastas dentro www, e ignora todos eles com o padrão *. Parece levar aos mesmos resultados, já que o git não rastreará uma pasta vazia wwwse todos os seus arquivos / pastas filho forem ignorados. E, de fato, os resultados não serão diferentes para o caso de OP com www/ou www/*autônomo. Mas faz diferença se for combinado com outras regras.

Por exemplo, e se quisermos apenas incluir, www/1.txtmas ignorar todos os outros dentro www?

O seguinte .gitignorenão funcionará.

www/
!www/1.txt

Embora o seguinte .gitignorefuncione, por quê?

www/*
!www/1.txt

Para o primeiro, git apenas ignora o diretório wwwe nem mesmo olha dentro para incluir www/1.txtnovamente. A primeira regra exclui o diretório pai, wwwmas não www/1.txte, como resultado, www/1.txtnão pode ser " incluída novamente ".

Mas para o último, git primeiro ignora todos os arquivos / arquivos abaixo www, e então inclui um deles novamente, que é www/1.txt.

Para este exemplo, as seguintes linhas na documentação podem ajudar:

Um prefixo opcional "!" que nega o padrão; qualquer arquivo correspondente excluído por um padrão anterior será incluído novamente. Não é possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído.


Você não acha isso www/1.txte www/faria o mesmo que a segunda abordagem ...
Naveed Butt

8

Estou apenas analisando a documentação e, pelo que posso dizer, eles diferem apenas em padrões mais avançados, por exemplo,

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

Eu fiz o teste acima, e se você substituir !/foocom!/foo/* , você realmente obter um resultado diferente.

Nota

foo

Irá excluir qualquer arquivo foo, mas

foo/

irá excluir apenas diretórios chamados foo.


3

Além das respostas perfeitamente boas que você já obteve, você deve notar que pode ter .gitignore em qualquer lugar em seu projeto, incluindo subpastas.

Então, se você deseja ignorar todos os arquivos dentro www, mas deseja que a wwwpasta seja versionada, ao invés de usar um vazio .gitkeep, .dummyou qualquer nome que você escolher, por que não usar um .gitignorelá, dizendo para ignorar todos os arquivos?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

Na raiz .gitignore(a), você não diz nada sobre owww pasta ou seu conteúdo.

Em www/.gitignore(b) você coloca o seguinte:

# ignore all files in this folder except this .gitignore
*
!.gitignore

Dessa forma, tudo parece mais organizado (pelo menos para mim).


1

Para ignorar tudo em um diretório, exceto dotfiles, você pode usar o seguinte padrão glob em seu .gitignore:

www/[^.]*

Portanto, não há necessidade de um extra .gitignore, basta adicionar um .keeparquivo ao seu wwwdiretório.

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.