O Git exclui pastas vazias?

O Git exclui pastas vazias?

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 addse 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 .gitkeepem 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 .gitkeeparquivo (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 READMEarquivo 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 foodiretó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 .gitignorearquivo às pastas que deseja incluir em seu repositório.

# Ignore everything in this directory
*
# Except this file
!.gitignore

Adicionar .gitkeepfunciona, 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( -dffxpossivelmente 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.

informação relacionada