git rm - fatal: pathspec não encontrou nenhum arquivo


87

Eu adicionei mais de 9.000 fotos por acidente à minha pasta de projetos. E os cometeu. Em seguida, excluiu-os do disco. Comprometido.

Agora tento enviar alterações para o servidor git. Mas demora muito e tenta enviar 12 Gb de dados.

Eu verifiquei o tamanho dos arquivos no disco e vi que a .gitpasta realmente ocupa 12 Gb.

Como deletar fotos de lá? Eu tentei git rm, mas falhei:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

Porque já os apaguei do disco, mas ainda estão na .gitpasta.

Tentei adicionar public/photosa .gitignore:

public/photos/
*.zip

Mas nenhum resultado. É claro que eu poderia hard reset headquando não tivesse tantas fotos inúteis em meu projeto. Mas desde então eu me comprometi várias vezes e fiz muitas mudanças no código.

Respostas:


86

No seu caso, use em git filter-branchvez de git rm.

git rm irá deletar os arquivos no sentido de que eles não serão mais rastreados pelo git, mas isso não remove os objetos de commit antigos correspondentes a essas imagens, e então você ainda terá que empurrar os commits anteriores que correspondem a 12 GB de imagens.

O git filter-branch, por outro lado, pode remover esses arquivos de todos os commits anteriores, dispensando assim a necessidade de enviar qualquer um deles.

  1. Use o comando

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. Depois que a ramificação do filtro for concluída, verifique se nenhum arquivo indesejado foi perdido.

  3. Agora adicione uma regra .gitignore

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. Agora dê um empurrão

    git push -f origin branch
    

Verifique isto , isto e isto para obter mais ajuda. Para ficar mais seguro, sugiro que você crie uma cópia de backup do repo em seu sistema antes de prosseguir com essas instruções.

Quanto à sua mensagem de erro original, está acontecendo porque você já os desviou usando git rme, portanto, o git está reclamando porque não pode remover um arquivo que não está rastreando. Leia mais sobre isso aqui .


2
Ei, estou com o mesmo problema, mas ao digitar o comando na etapa 1, recebo um erro: fatal: revisão incorreta '--prune-empty'. Qualquer pista?
kevin

@kevin desculpe, perdi este comentário. Você pode executá-lo sem esse sinalizador. A poda teria removido qualquer objeto de confirmação vazio.
mu 無

1
Esta linha não deveria git add .gitignore && commit -m "ignore rule for photos"sergit add .gitignore && git commit -m "ignore rule for photos"
Clone de

@Clone sim, deveria ter sido isso, corrigi agora :)
mu 無

1
Esta é uma resposta incrivelmente incrível. Corrigido um problema que tenho tido com meu repo há vários anos. Obrigado!
Moshe

18

Uma resposta muito simples é.

Passo 1:

Em primeiro lugar, adicione seus arquivos não rastreados que deseja excluir:

usando git add .ou git add <filename>.

Passo 2:

Em seguida, exclua-os facilmente usando o comando git rm -f <filename>aqui rm = remove e -f = forcely.


isto não fará o que o OP deseja, que é remover arquivos que estão presentes em commits anteriores. Você precisa usar git filter-branchconforme mencionado em outro lugar.
Simon Stevens,

9

Passo 1

Adicione o (s) nome (s) de .gitignorearquivo ao seu arquivo.

Passo 2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

etapa 3

git push -f origin branch

Um grande obrigado a @mu.


7
... eu sempre pensei que git era mais difícil do que deveria ser, isso prova isso. Não há como alguém se lembrar da existência da maioria dos comandos git, muito menos de seus sinalizadores e peculiaridades. O modelo Git faz sentido e funciona até que você siga um fluxo simples e, assim que você travar, travará muito.
Muhammad Umer

2
Esta é a solução que funciona para mim, eu precisava do--ignore-unmatch
guhur


1

Essas correntes funcionam no meu caso:

  1. git rm -r WebApplication/packages

Houve um git-dialog de confirmação. Você deve escolher a opção "y".

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

fez o trabalho, restaurou os arquivos que eu havia excluído usando em rmvez de git rm.

Fiz primeiro uma verificação do último hash, mas não acredito que seja necessário.


0

Para remover o arquivo rastreado e antigo confirmado do git, você pode usar o comando abaixo. Aqui, no meu caso, quero desfazer e remover todo o arquivo do distdiretório.

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

Em seguida, você precisa adicioná-lo ao seu .gitignorepara que não seja rastreado posteriormente.


-1

Eu tinha um diretório duplicado (~ web / web) e ele removeu a duplicata aninhada quando executei rm -rf webenquanto estava dentro da primeira pasta web.


Desculpe! Devo ter interpretado mal a pergunta. Achei que era esse o objetivo
ccsinsf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.