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.
bin
ebin/
é que o primeiro irá ignorar arquivos ou pastas, o último apenas as pastas. Eu não sei a diferença combin/*
Respostas:
Existem diferenças entre
www
,www/
ewww/*
.Basicamente, a partir da documentação e meus próprios testes,
www
encontrar uma correspondência com um arquivo ou diretório,www/
apenas corresponde a um diretório, enquantowww/*
combina diretórios e arquivos dentrowww
.Vou apenas discutir as diferenças entre
www/
ewww/*
aqui, já que as diferenças entrewww
ewww/
são óbvias.Pois
www/
, git ignora owww
próprio diretório , o que significa que o git nem vai olhar dentro. Mas parawww/*
, git verifica todos os arquivos / pastas dentrowww
, e ignora todos eles com o padrão*
. Parece levar aos mesmos resultados, já que o git não rastreará uma pasta vaziawww
se todos os seus arquivos / pastas filho forem ignorados. E, de fato, os resultados não serão diferentes para o caso de OP comwww/
ouwww/*
autônomo. Mas faz diferença se for combinado com outras regras.Por exemplo, e se quisermos apenas incluir,
www/1.txt
mas ignorar todos os outros dentrowww
?O seguinte
.gitignore
não funcionará.Embora o seguinte
.gitignore
funcione, por quê?Para o primeiro, git apenas ignora o diretório
www
e nem mesmo olha dentro para incluirwww/1.txt
novamente. A primeira regra exclui o diretório pai,www
mas nãowww/1.txt
e, como resultado,www/1.txt
nã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:
fonte
www/1.txt
ewww/
faria o mesmo que a segunda abordagem ...Estou apenas analisando a documentação e, pelo que posso dizer, eles diferem apenas em padrões mais avançados, por exemplo,
Eu fiz o teste acima, e se você substituir
!/foo
com!/foo/*
, você realmente obter um resultado diferente.Nota
Irá excluir qualquer arquivo
foo
, masirá excluir apenas diretórios chamados foo.
fonte
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 awww
pasta seja versionada, ao invés de usar um vazio.gitkeep
,.dummy
ou qualquer nome que você escolher, por que não usar um.gitignore
lá, dizendo para ignorar todos os arquivos?Na raiz
.gitignore
(a), você não diz nada sobre owww
pasta ou seu conteúdo.Em
www/.gitignore
(b) você coloca o seguinte:Dessa forma, tudo parece mais organizado (pelo menos para mim).
fonte
Para ignorar tudo em um diretório, exceto dotfiles, você pode usar o seguinte padrão glob em seu
.gitignore
:Portanto, não há necessidade de um extra
.gitignore
, basta adicionar um.keep
arquivo ao seuwww
diretório.fonte