
Excluí todos os arquivos de um diretório na minha pasta de trabalho, mas o diretório ainda existe. Depois de enviar as alterações para um repositório remoto (GitHub) Verifiquei meu projeto e percebi que o diretório havia sumido. É possível que o Git exclua pastas vazias?
Responder1
Por que o diretório não é mostrado?
O Git não rastreia diretórios; ele apenas rastreia arquivos.
Se não houver arquivos em um diretório, esse diretório não “existe” para o Git ao adicionar ou remover arquivos. Particularmente, um diretório desaparecerá do índice do Git quando você excluir todos os arquivos dele e adicionar essa alteração ao índice. Vice-versa, um diretório não será adicionado git add
se estiver vazio.
Em outras palavras: se você consegue ver o diretório localmente em seu navegador de arquivos, mas ele desapareceu do GitHub, provavelmente você removeu todos os arquivos do diretório, adicionou essa alteração ao índice e a confirmou e enviou por push.
Como faço para rastrear um diretório vazio, então?
Se quiser rastrear explicitamente um diretório vazio, você deverá criar um arquivo nele. Como o Git não rastreia diretórios vazios, você precisa enganá-lo adicionando um arquivo do diretório ao índice do Git.
Normalmente, as pessoas armazenam um arquivo chamado .gitkeep
em um diretório que desejam rastrear, mas onde o diretório deve permanecer vazio por enquanto. Você pode fornecer o arquivoqualqueroutro nome, é claro, mas o nome .gitkeep
é uma convenção. O .gitkeep
arquivo (por começar com .
) não será mostrado nas listagens de arquivos na maioria dos sistemas.
Em vez de .gitkeep
, alguns usuários também gostam de colocar um README
arquivo lá, de preferência com uma breve descrição do motivo pelo qual o diretório deve existir.
Exemplo
$ mkdir foo
$ git init
$ git add .
$ git ls-files # which files does Git know about?
# apparently, none
$ touch foo/bar # create a file in the directory
$ git add .
$ git ls-files # does Git know about it now?
foo/bar # yep!
Aqui, o foo
diretório só é adicionado ao índice quando um arquivo está nele.
E se eurealmentedeseja rastrear um diretório vazio?
Dito isto, em princípio, a estrutura de dados subjacente permite ao Git armazenar um diretório vazio, uma vez que seria representado por uma “árvore” vazia. Algumas leituras adicionaisaquieaqui.
Responder2
Adicione o seguinte .gitignore
arquivo às pastas que deseja incluir em seu repositório.
# Ignore everything in this directory
*
# Except this file
!.gitignore
Adicionar .gitkeep
funciona, mas não é uma solução oficial. Verhttps://stackoverflow.com/questions/7229885/what-are-the-differences-between-gitignore-and-gitkeep
Responder3
O Git pode excluir pastas se você executar git clean
( -dffx
possivelmente até com um subconjunto dessas opções).
Como @TRiG menciona nos comentários, se o diretório estiver vazio quando você fizer o commit, ele não aparecerá, por exemplo, no GitHub, porque o git não rastreia diretórios (ele rastreia arquivos) - a árvore onde esses arquivos estavam não é não é mais relevante porque não há arquivos, portanto não há árvore.
Sem mais detalhes, é praticamente impossível respondermos adequadamente às suas perguntas subjacentes (o que aconteceu?).
Responder4
Para Linux/MAC OSX, use o seguinte one-liner, para criar/colocar arquivos de espaço reservado vazios nas pastas, recursivamente, para evitar que sejam ignorados, pelo git:
find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;
Espero que isso ajude alguém.