Remover uma pasta do git tracking

404

Preciso excluir uma pasta (uploads de nomes) do rastreamento. Eu tentei correr

git rm -r --cached wordpress/wp-content/uploads

e depois adicionei o caminho para .gitignore

/wordpress/wp-content/uploads

mas quando corri, git statuseles aparecem como excluídos. Se eu tentar confirmar as alterações, os arquivos serão excluídos, não apenas removidos do rastreamento.

O que estou fazendo errado?

Eu também tentei

git update-index --assume-unchanged <file>

mas isso parece rastrear apenas arquivos. Mas preciso remover uma pasta inteira (incluindo subpastas) do rastreamento.

Stefan Diabo
fonte
Excluir não significa que o git excluirá seus arquivos. No entanto, se você usar reset --hard, ele usará.
Keltar
2
Como o @keltar menciona, a confirmação não fará com que seus arquivos sejam excluídos. Ele confirmará a exclusão do Git , mas sua cópia de trabalho ainda os conterá. Mas se você pullconfirmar em outro lugar, esses arquivos serão excluídos do novo sistema.
18714 Chris

Respostas:

868

Me deparei com essa pergunta enquanto pesquisava no Google por "git remove folder from tracking". A pergunta do OP me levou à resposta. Estou resumindo aqui para as gerações futuras.

Questão

Como removo uma pasta do meu repositório git sem excluí-la da minha máquina local (por exemplo, ambiente de desenvolvimento)?

Responda

Etapa 1. Adicione o caminho da pasta ao .gitignorearquivo raiz do seu repositório .

path_to_your_folder/

Etapa 2. Remova a pasta do seu rastreamento git local, mas mantenha-a em seu disco.

git rm -r --cached path_to_your_folder/

Etapa 3. Envie suas alterações ao seu repositório git.

A pasta será considerada "excluída" do ponto de vista do Git (ou seja, eles estão no histórico anterior, mas não no último commit, e as pessoas que fazem parte deste repositório obtêm os arquivos removidos de suas árvores), mas permanecem no diretório de trabalho porque você já usou --cached.

Tod Birdsall
fonte
2
Pergunta rápida, o caminho da pasta precisa ser o caminho completo? ou apenas o caminho com o repositório git agindo como base?
HMSCelestia
Eu acredito que é o caminho completo, mas não me lembro com certeza.
Tod Birdsall
7
"e as pessoas que sairem deste repositório removerão os arquivos de suas árvores" Posso impedir isso?
Leo Gasparrini
isso removeu corretamente meus arquivos do rastreamento em uma ramificação, mas os excluiu após uma mesclagem!
Harold
11
para mim ainda permanece. Além disso - devo desmarcar esses arquivos ao confirmar quais estão na pasta? Eu tentei nos dois sentidos. Se desmarcar, ele não permite o envio por push, mas alterei um caractere em outro arquivo que deve ser rastreado. Ainda não ajuda
Darius.V
44

Isso funciona para mim:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch é importante aqui, sem essa opção, o git sairá com erro no primeiro arquivo que não está no índice.

qed
fonte
unknown option 'ignore unmatched'
Inigo
Este é um sinalizador importante se o diretório estiver vazio, obrigado!
MNN
muito útil se você quiser apenas remover certas extensões de arquivo de um diretório também:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15
14

Para esquecer o diretório, adicione recursivamente /*/*ao caminho:

git update-index --assume-unchanged wordpress/wp-content/uploads/*/*

Usar git rm --cachednão é bom para colaboração. Mais detalhes aqui: como parar o rastreamento e ignorar as alterações em um arquivo no Git?

vitalets
fonte
11
Esta é uma solução muito elegante! o truque do caminho recursivo salvou meu dia. Obrigado!
Aziz Alto
8

Eu sei que esse é um tópico antigo, mas eu só queria adicionar um pouco, pois a solução marcada não resolveu o problema para mim (embora eu tenha tentado várias vezes).

A única maneira de eu realmente parar o git form tracking da pasta era fazer o seguinte:

  1. Faça um backup da pasta local e coloque-a em um local seguro.
  2. Exclua a pasta do seu repositório local
  3. Verifique se o cache está limpo git rm -r --cached your_folder/
  4. Adicionar your_folder/a .gitignore
  5. Confirmar as alterações
  6. Adicione o backup novamente ao seu repositório

Agora você deve ver que a pasta não é mais rastreada.

Não me pergunte por que apenas limpar o cache não funcionou para mim, não sou um super assistente do Git, mas foi assim que resolvi o problema.

lukehillonline
fonte
Obrigado!!! Git estava me deixando louco, sem ignorar a pasta .metadata do eclipse. Siga suas etapas com a pasta eclipse .metadata e finalmente funcionou.
precisa saber é o seguinte
5

Na documentação do git:

Outra coisa útil que você pode querer fazer é manter o arquivo na sua árvore de trabalho, mas removê-lo da sua área de preparação. Em outras palavras, convém manter o arquivo no disco rígido, mas o Git não o acompanha mais. Isso é particularmente útil se você esqueceu de adicionar algo ao seu arquivo .gitignore e o organizou acidentalmente, como um arquivo de log grande ou um monte de arquivos .a compilados. Para fazer isso, use a opção --cached:

$ git rm --cached readme.txt

Então, talvez não inclua o "-r"?

user3750325
fonte
11
O OP já tentou --cached. A -ropção é para "recursiva", que deve ser incluída nesta instância.
18714 Chris
Achei isso útil. Eu estava procurando como fazer isso em uma pasta e, em seguida, ver a maneira de fazer isso em um arquivo. Estou atualizando este comentário.
light