Eu verifiquei uma carga de arquivos em um branch e mesclei e, em seguida, tive que removê-los e agora fico com um grande arquivo .pack do qual não sei como me livrar.
Excluí todos os arquivos usando git rm -rf xxxxxx
e também executei a --cached
opção.
Alguém pode me dizer como posso remover um grande arquivo .pack que está atualmente no seguinte diretório:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
Eu só preciso remover o branch que ainda tenho, mas não estou mais usando? Ou há algo mais que preciso executar?
Não tenho certeza de quanta diferença faz, mas mostra um cadeado contra o arquivo.
obrigado
EDITAR
Aqui estão alguns trechos do meu bash_history que devem dar uma ideia de como consegui entrar nesse estado (suponha que neste ponto eu estou trabalhando em um branch git chamado 'my-branch' e tenho uma pasta contendo mais pastas / arquivos):
git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/ (not sure why I ran this as well but I did)
Eu pensei que também executei o seguinte, mas não aparece no bash_history com os outros:
git rm -rf --cached unwanted_folder/
Também pensei ter executado alguns comandos git (como git gc
) para tentar organizar o arquivo do pacote, mas eles também não aparecem no arquivo .bash_history.
fonte
Respostas:
O problema é que, embora você tenha removido os arquivos, eles ainda estão presentes nas revisões anteriores. Esse é o ponto principal do git, é que mesmo se você deletar algo, você ainda pode recuperá-lo acessando o histórico.
O que você está procurando fazer é chamado de reescrever a história, e envolveu o
git filter-branch
comando.O GitHub tem uma boa explicação do problema em seu site. https://help.github.com/articles/remove-sensitive-data
Para responder à sua pergunta mais diretamente, o que você basicamente precisa executar é este comando
unwanted_filename_or_folder
substituído de acordo:Isso removerá todas as referências aos arquivos do histórico ativo do repo.
Próxima etapa, para realizar um ciclo de GC para forçar todas as referências ao arquivo a serem expiradas e eliminadas do packfile. Nada precisa ser substituído nesses comandos.
fonte
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
2)git reflog expire --expire=now --all
3)git gc --prune=now
bfg
muito mais fácil. Também é recomendado nos documentos oficiais do github: help.github.com/articles/…Cenário A : Se seus arquivos grandes foram adicionados apenas a uma ramificação, você não precisa executar
git filter-branch
. Você só precisa excluir o branch e executar a coleta de lixo:Cenário B : No entanto, com base no histórico do bash, parece que você mesclou as alterações no master. Se você não compartilhou as alterações com ninguém (
git push
ainda não ). A coisa mais fácil seria restaurar o master para antes de mesclar com o branch que tinha os arquivos grandes. Isso eliminará todos os commits de seu branch e todos os commits feitos para o master após a fusão. Portanto, você pode perder alterações - além dos arquivos grandes - que você realmente queria:Em seguida, execute as etapas do cenário A.
Cenário C : Se houver outras mudanças no branch ou mudanças no master após a fusão que você deseja manter, seria melhor realocar o master e incluir seletivamente os commits que você deseja:
Em seu editor, remova as linhas que correspondem aos commits que adicionaram os arquivos grandes, mas deixe todo o resto como está. Salve e saia. Seu branch master deve conter apenas o que você deseja, e nenhum arquivo grande. Observe que
git rebase
sem-p
irá eliminar os commits de mesclagem, então você ficará com um histórico linear para o mestre depois<commit hash>
. Isso provavelmente é bom para você, mas se não, você pode tentar com-p
, masgit help rebase
dizcombining -p with the -i option explicitly is generally not a good idea unless you know what you are doing
.Em seguida, execute os comandos do cenário A.
fonte
Como loganfsmyth já declarou em sua resposta , você precisa limpar o histórico do git porque os arquivos continuam existindo lá mesmo após excluí-los do repo. Os documentos oficiais do GitHub recomendam o BFG, que considero mais fácil de usar do que
filter-branch
:Excluindo arquivos do histórico
Baixe o BFG de seu site. Certifique-se de ter o java instalado e, em seguida, crie um clone de espelho e limpe o histórico. Certifique-se de substituir
YOUR_FILE_NAME
pelo nome do arquivo que deseja excluir:Apagar uma pasta
O mesmo que acima, mas use
--delete-folders
Outras opções
O BFG também permite opções ainda mais sofisticadas (consulte a documentação ), como estas:
Remova todos os arquivos com mais de 100 MB do histórico:
Importante!
Ao executar o BFG, tome cuidado para que ambos
YOUR_FILE_NAME
eYOUR_FOLDER_NAME
sejam apenas nomes de arquivo / pasta. Eles não são caminhos , então algo comofoo/bar.jpg
não funcionará! Em vez disso, todos os arquivos / pastas com o nome especificado serão removidos do histórico do repo, independentemente do caminho ou branch em que existam.fonte
bfg
ferramenta a um repositório git local, como o comando deve ser?Uma opção:
execute
git gc
manualmente para condensar vários arquivos de pacote em um ou alguns arquivos de pacote. Esta operação é persistente (ou seja, o arquivo de pacote grande manterá seu comportamento de compactação), portanto, pode ser benéfico compactar um repositório periodicamente comgit gc --aggressive
Outra opção é salvar o código e .git em algum lugar e, em seguida, excluir o .git e começar novamente usando este código existente, criando um novo repositório git (
git init
).fonte
git gc
e consegui apenas alguns arquivos de pacote, mas o grande ainda é um deles e eu gostaria apenas de me livrar dele para que eu possa fazer backup da pasta externamente mais fácil (zip antes era 1 -2Mb, agora 55Mb). A menos que alguém possa sugerir algo mais, acho que devo criar um novo git. Presumo que isso signifique que vou perder o acesso aos branches que tenho atualmente, etc ...?Execute o seguinte comando, substituindo
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
pelo caminho para o arquivo que deseja remover, não apenas pelo nome do arquivo. Esses argumentos irão:Isso removerá à força todas as referências aos arquivos do histórico ativo do repo.
Próxima etapa, para executar um ciclo de GC para forçar todas as referências ao arquivo a serem expiradas e eliminadas do arquivo de pacote. Nada precisa ser substituído nesses comandos.
fonte
Estou um pouco atrasado para o show mas caso a resposta acima não resolvesse a dúvida então encontrei outro jeito. Simplesmente remova o arquivo grande específico de .pack. Tive o problema de fazer check-in acidental de um arquivo grande de 2 GB. Segui as etapas explicadas neste link: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/
fonte
esta é uma solução mais prática do que de codificação. Compacte o arquivo. Abra o zip no formato de exibição de arquivo (diferente de descompactar). Exclua o arquivo .pack. Descompacte e substitua a pasta. Funciona como um encanto!
fonte