A eliminação do arquivo do repositório Git falhou, não foi possível criar um novo backup

116

Tentei remover um arquivo do meu repo remoto executando:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

Mas Git reclama que

Não é possível criar um novo backup. Já existe um backup anterior em refs / original /
Forçar a substituição do backup com -f
rm: não é possível remover /.git-rewrite/backup-refs: Permissão negada
rm: não é possível remover o diretório /.git-rewrite: Diretório não vazio

Isso foi depois que eu já excluí o diretório .git-rewrite no Windows.

Como posso remover esse arquivo? É um arquivo de 29 MB no meu repositório, então preciso remover o arquivo.

Eu tentei deletar o commit no git rebase -i, mas aparentemente porque o commit tocou em muitos arquivos diferentes, Git reclama de conflitos e abortei por segurança.

Cardin
fonte
1
Para mecanismos de pesquisa: isso também pode se aplicar quando sua mensagem de erro for .git-rewrite already exists, please remove it.
Drew Noakes em

Respostas:

219

Você já executou uma operação de ramificação de filtro. Depois de filter-branch, Git mantém referências para os commits antigos, caso algo dê errado.

Você pode encontrar aqueles em .git/refs/original/…. Exclua esse diretório e todos os arquivos dentro dele ou use a -fsinalização para forçar o Git a excluir as referências antigas.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
tricô
fonte
10
Finalmente comecei a trabalhar, obrigado! Eu tentei o sinalizador -f, mas o problema era que eu estava colocando-o no final do comando, por exemplo. CABEÇA -f. Ver o seu comando me fez tentar colocar a bandeira no início, e funcionou! = D
Cardin
12
flags de opção ( -f) vão antes de refs ( HEAD). os
árbitros
Ainda estou recebendo o mesmo erro após adicionar -f E excluir o diretório. Alguma ideia?
Yaron
1
@knittl, eu não estava me referindo git add. Estava recebendo o mesmo erro do autor da postagem original mesmo depois de excluir a .git/refs/original/pasta e usar o -fflag no git filter-branchcomando. A solução, no meu caso, foi deletar o .git/packed-refsarquivo.
Yaron,
1
@knittl, descobri como consertar, mas não descobri qual era o problema. Basicamente, adicionei --ignore-unmatchao comando git rme tudo correu bem!
Gabrielius
21

Use este comando para remover o backup original:

git update-ref -d refs/original/refs/heads/master

Aqui está a essência que usei para filtrar meu repositório git: https://gist.github.com/k06a/25a0214c98bc19fd6817

k06a
fonte
Esta é a solução certa para remover o backup! Excluir .git/refs/original/não resolve o problema.
Erik Koopmans
Certifique-se de mudar 'master' para o branch que você está tentando corrigir .. no meu caso 'desenvolver'
Damian Green
git show-ref | awk '/ refs.original.refs/{print$2}'para localizar todos os backups que seu repo possui.
Dan
4

Eu tive o mesmo problema e a resposta acima não resolveu. Não havia mais diretório .git / refs / original /. A solução para mim foi excluir o arquivo .git / pack-refs.

Yaron
fonte
Mesmo problema. Nenhum .git/packed-refsarquivo, entretanto, e nenhuma pasta originalem .git/refs. Qualquer um?
XedinUnknown
Resolvido aqui adicionando o -rsinalizador ao comando.
XedinUnknown
Mesmo problema aqui. Excluir refs compactados resolveu o problema, mas também arruinou o resto do meu diretório git e tive que restaurar do backup.
Kevin Yin
2

Adicione uma força ao comando de ramificação do filtro.

Adam Dymitruk
fonte