Eu tenho um repositório do GitHub que tinha dois ramos - master e release.
O ramo de lançamento continha arquivos de distribuição binária que estavam contribuindo para um tamanho de repositório muito grande (> 250 MB), então decidi limpar as coisas.
Primeiro, excluí o ramo de lançamento remoto, via git push origin :release
Em seguida, excluí o ramo de lançamento local. Primeiro tentei git branch -d release
, mas o git disse "erro: o ramo 'release' não é um ancestral do seu HEAD atual". o que é verdade, então eu fizgit branch -D release
para forçar a exclusão.
Mas o tamanho do meu repositório, localmente e no GitHub, ainda era enorme. Então, eu corri pela lista usual de comandos git, comogit gc --prune=today --aggressive
, sem sorte.
Seguindo as instruções de Charles Bailey no SO 1029969 , consegui obter uma lista de SHA1s para os maiores blobs. Eu então usei o script do SO 460331 para encontrar os blobs ... e os cinco maiores não existem, embora sejam encontrados blobs menores, então eu sei que o script está funcionando.
Eu acho que esses blogs são os binários do ramo de lançamento e, de alguma forma, foram deixados de lado após a exclusão desse ramo. Qual é o caminho certo para se livrar deles?
Respostas:
... e sem mais delongas, posso apresentar a você este comando útil, "git-gc-all", garantido para remover todo o seu lixo git até que possam aparecer variáveis extras de configuração:
Você também pode precisar executar algo como estes primeiro, oh querido, o git é complicado!
Você também pode precisar remover algumas tags, graças ao Zitrax:
Coloquei tudo isso em um script: git-gc-all-ferocious .
fonte
objects
. O que são e por que são (aparentemente) irrelevantes?Conforme descrito aqui , se você deseja remover permanentemente tudo relacionado apenas via reflog , basta usar
git reflog expire --expire-unreachable=now --all
remove todas as referências de confirmações inacessíveis emreflog
.git gc --prune=now
remove os commits eles mesmos.Atenção : Somente o uso
git gc --prune=now
não funcionará, pois essas confirmações ainda são referenciadas no reflog. Portanto, limpar o reflog é obrigatório. Observe também que, se você o usar, terárerere
referências adicionais não limpas por esses comandos. Vejagit help rerere
para mais detalhes. Além disso, quaisquer confirmações referenciadas por ramificações ou tags locais ou remotas não serão removidas porque são consideradas dados valiosos pelo git.fonte
git fetch --prune
reduzir ainda mais o tamanho porque a exclusão de blobs locais.Conforme mencionado nesta resposta SO ,
git gc
pode realmente aumentar o tamanho do repositório!Veja também este tópico
O mesmo segmento menciona :
Na parte da frente do filtro, você pode considerar (com cautela) esse script
fonte
filter-branch
uso do comando.git gc --prune=now
, ou nível baixogit prune --expire now
.fonte
Cada vez que seu HEAD se move, o git rastreia isso no
reflog
. Se você removeu confirmações, você ainda tem "confirmações pendentes" porque elas ainda são referenciadas porreflog
~ 30 dias. Esta é a rede de segurança quando você exclui confirmações por acidente.Você pode usar o
git reflog
comando remove commits específicos, reembalar, etc., ou apenas o comando de alto nível:fonte
Você pode usar
git forget-blob
.O uso é bem simples
git forget-blob file-to-forget
. Você pode obter mais informações aquihttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Ele desaparecerá de todos os commits em seu histórico, reflog, tags e assim por diante
Deparo-me com o mesmo problema de vez em quando, e sempre que preciso voltar a este post e a outros, é por isso que automatizei o processo.
Créditos a colaboradores como Sam Watkins
fonte
Tente usar o git-filter-branch - ele não remove grandes blobs, mas pode remover arquivos grandes que você especificar em todo o repositório. Para mim, reduz o tamanho do repositório de centenas de MB para 12 MB.
fonte
Às vezes, a razão pela qual "gc" não faz muito bem é que há uma recuperação ou esconderijo inacabado com base em um commit antigo.
fonte
Para adicionar outra dica, não se esqueça de usar a remoção remota git para excluir as ramificações obsoletas de seus controles remotos antes de usar git gc
você pode vê-los com o git branch -a
Geralmente é útil quando você busca nos repositórios github e bifurcados ...
fonte
Antes de fazer
git filter-branch
egit gc
, revise as tags presentes no seu repositório. Qualquer sistema real que tenha marcação automática para coisas como integração e implantações contínuas fará com que objetos indesejados ainda sejam referenciados por essas tags, portanto,gc
não será possível removê-las e você continuará se perguntando por que o tamanho do repo ainda é tão grande.A melhor maneira de se livrar de todas as coisas queria-un é executar
git-filter
egit gc
em seguida, empurre mestre para um novo repo nua. O novo repositório vazio terá a árvore limpa.fonte