Ambos os exemplos da pergunta são realmente muito ruins que podem levar à perda de dados!
Meu conselho: nunca anexe /*
diretórios em arquivos .gitignore, a menos que você tenha um bom motivo!
Uma boa razão seria, por exemplo, o que Jefromi escreveu: "se você pretende posteriormente ignorar algo no diretório" .
A razão pela qual isso não deveria ser feito é que o acréscimo /*
aos diretórios funciona, por um lado, da maneira que ignora corretamente todo o conteúdo do diretório, mas, por outro lado, tem um efeito colateral perigoso:
Se você executar git stash -u
(para esconder temporariamente arquivos rastreados e não rastreados) ou git clean -df
(para excluir arquivos não rastreados, mas manter ignorados) em seu repositório, todos os diretórios ignorados com um anexo /*
serão excluídos irreversivelmente !
Alguma experiência
Eu tive que aprender isso da maneira mais difícil. Alguém da minha equipe estava anexando/*
alguns diretórios em nosso .gitignore. Ao longo do tempo, tive ocasiões em que certos diretórios desapareceram repentinamente. Diretórios com gigabytes de dados locais necessários para a nossa aplicação. Ninguém poderia explicar e eu sempre lembro de baixar novamente todos os dados. Depois de um tempo, tive a noção de que isso poderia ter a ver git stash
. Um dia, eu queria limpar meu repositório local (enquanto mantinha os arquivos ignorados) e estava usando, git clean -df
e novamente meus dados se foram. Desta vez, tive o suficiente e investiguei o problema. Eu finalmente percebi que o motivo é o anexo /*
.
Suponho que isso possa ser explicado de alguma forma pelo fato de que directory/*
ignorar todo o conteúdo do diretório, mas não o próprio diretório. Portanto, não é considerado rastreado nem ignorado quando as coisas são excluídas. Mesmo assim, git status
e git status --ignored
dê uma imagem um pouco diferente.
Como reproduzir
Aqui está como reproduzir o comportamento. Atualmente, estou usando o Git 2.8.4.
Um diretório chamado localdata/
com um arquivo fictício nele ( important.dat
) será criado em um repositório git local e o conteúdo será ignorado ao ser /localdata/*
inserido no .gitignore
arquivo. Quando um dos dois comandos git mencionados for executado agora, o diretório será (inesperadamente) perdido.
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Se você fizer um git status --ignored
aqui, receberá:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Agora, faça
git stash -u
git stash pop
ou
git clean -df
Nos dois casos, o diretório supostamente ignorado localdata
desaparecerá!
Não tenho certeza se isso pode ser considerado um bug, mas acho que é pelo menos um recurso que ninguém precisa.
Vou relatar isso na lista de desenvolvimento do git e ver o que eles pensam sobre isso.
.gitignore
diferença entre arquivos e diretórios que ignora? por exemplo,data
vsdata/
significa coisas diferentes?