Eu tenho um repositório Git de 300 MB. O tamanho total dos meus arquivos com saída atualmente registrada é de 2 MB e o tamanho total do restante do repositório git é de 298 MB. Este é basicamente um repositório somente de código que não deve ter mais do que alguns MB.
Suspeito que alguém acidentalmente tenha cometido alguns arquivos grandes (vídeo, imagens etc.) e os tenha removido ... mas não do git, portanto a história ainda contém arquivos grandes inúteis. Como encontrar os arquivos grandes no histórico do git? Existem mais de 400 confirmações, portanto, ir um a um não é prático.
NOTA : minha pergunta não é sobre como remover o arquivo , mas como encontrá- lo em primeiro lugar.
Respostas:
Eu encontrei esse script muito útil no passado para encontrar objetos grandes (e não óbvios) em um repositório git:
Isso fornecerá o nome do objeto (SHA1sum) do blob e você poderá usar um script como este:
... para encontrar o commit que aponta para cada um desses blobs.
fonte
🚀 Um one-liner shell incrivelmente rápido 🚀
Esse script de shell exibe todos os objetos de blob no repositório, classificados do menor para o maior.
Para o meu repositório de amostras, ele foi executado 100 vezes mais rápido que os outros encontrados aqui.
No meu confiável sistema Athlon II X4, ele lida com o repositório Linux Kernel com seus 5,6 milhões de objetos em pouco mais de um minuto .
O Script Base
Quando você executa o código acima, você obtém uma boa saída legível por humanos como esta:
Usuários do macOS : como
numfmt
não está disponível no macOS, você pode omitir a última linha e lidar com tamanhos de bytes brutos oubrew install coreutils
.Filtragem
Para obter mais filtragem , insira qualquer uma das seguintes linhas antes da
sort
linha .Para excluir arquivos presentes
HEAD
, insira a seguinte linha:Para mostrar apenas os arquivos que excedem o tamanho especificado (por exemplo, 1 MiB = 2 20 B), insira a seguinte linha:
Saída para computadores
Para gerar uma saída mais adequada para processamento adicional por computadores, omita as duas últimas linhas do script base. Eles fazem toda a formatação. Isso deixará você com algo assim:
Remoção de arquivo
Para a remoção real do arquivo, consulte esta questão SO no tópico .
fonte
brew install coreutils
e substituicut
porgcut
enumfmt
comgnumfmt
.git large
alguém?Encontrei uma solução de uma linha na página wiki do ETH Zurich Department of Physics (perto do final dessa página). Basta fazer um
git gc
para remover o lixo obsoleto e depoislhe dará os 10 maiores arquivos do repositório.
Agora também há uma solução mais preguiçosa, o GitExtensions agora possui um plug-in que faz isso na interface do usuário (e também lida com reescrições do histórico).
fonte
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Etapa 1 Escreva todos os SHA1s de arquivo em um arquivo de texto:
Etapa 2 Classifique os blobs do maior para o menor e grave os resultados no arquivo de texto:
Etapa 3a Combine os dois arquivos de texto para obter informações sobre o nome do arquivo / sha1 / size:
Etapa 3b Se você tiver nomes de arquivos ou caminhos que contenham espaços, tente esta variação da Etapa 3a. Ele usa em
cut
vez deawk
para obter as colunas desejadas, incl. espaços da coluna 7 até o final da linha:Agora você pode olhar para o arquivo bigtosmall.txt para decidir quais arquivos você deseja remover do seu histórico do Git.
Etapa 4 Para executar a remoção (observe que esta parte é lenta, pois ela examinará todas as confirmações em seu histórico quanto a dados sobre o arquivo que você identificou):
Fonte
As etapas 1-3a foram copiadas de Localização e remoção de arquivos grandes do histórico do Git
EDITAR
O artigo foi excluído em algum momento no segundo semestre de 2017, mas uma cópia arquivada ainda pode ser acessada usando a Wayback Machine .
fonte
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Note que você tem que digitar o caractere real TAB depoisjoin -t'
com CTRL + V <TAB> per geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html$'\t'
deve fornecer uma guia.echo -n $'\t' | xxd -ps
->09
Você deve usar o BFG Repo-Cleaner .
De acordo com o site:
O procedimento clássico para reduzir o tamanho de um repositório seria:
fonte
--strip-biggest-blobs 500
faz?Se você deseja apenas ter uma lista de arquivos grandes, gostaria de fornecer o seguinte conteúdo:
Cuja produção será:
A última entrada na lista aponta para o maior arquivo do seu histórico do git.
Você pode usar essa saída para garantir que não esteja excluindo itens com o BFG que você precisaria em seu histórico.
fonte
1.1, 1.2, 2.3
números?<filenumber>.<field>
especificação da ordem da combinação. Veja man.cx/join para mais informações.Se você estiver no Windows, aqui está um script do PowerShell que imprimirá os 10 maiores arquivos do seu repositório:
fonte
You cannot call a method on a null-valued expression. At line: 2 char: 1
. No entanto, esta resposta funcionou: stackoverflow.com/a/57793716/2441655 (também é mais curto)Tente
git ls-files | xargs du -hs --threshold=1M
.Usamos o comando abaixo em nosso pipeline de IC, ele para se encontrar algum arquivo grande no repositório git:
fonte
Não pude usar a resposta mais popular porque a
--batch-check
opção de linha de comando para o Git 1.8.3 (que eu tenho que usar) não aceita argumentos. As etapas a seguir foram tentadas no CentOS 6.5 com Bash 4.1.2Conceitos chave
No Git, o termo blob implica o conteúdo de um arquivo. Observe que uma confirmação pode alterar o conteúdo de um arquivo ou nome de caminho. Portanto, o mesmo arquivo pode se referir a um blob diferente, dependendo da confirmação. Um determinado arquivo pode ser o maior na hierarquia de diretórios em um commit, enquanto não em outro. Portanto, a questão de encontrar confirmações grandes em vez de arquivos grandes coloca os assuntos na perspectiva correta.
Para o impaciente
O comando para imprimir a lista de blobs em ordem decrescente de tamanho é:
Saída de amostra:
Para remover esses blobs, use o BFG Repo Cleaner , conforme mencionado em outras respostas. Dado um arquivo
blobs.txt
que contém apenas os hashes de blob, por exemplo:Faz:
A questão é encontrar os commits, o que é mais trabalhoso do que encontrar blobs. Para saber, por favor, continue lendo.
Trabalho adicional
Dado um hash de confirmação, um comando que imprime hashes de todos os objetos associados a ele, incluindo blobs, é:
Portanto, se tivermos essas saídas disponíveis para todas as confirmações no repositório, com um hash de blob, o conjunto de confirmações será o que corresponderá a qualquer uma das saídas. Essa ideia está codificada no seguinte script:
Se o conteúdo for salvo em um arquivo nomeado
find-commits.sh
, uma chamada típica será como em:Como anteriormente, o arquivo
blobs.txt
lista hashes de blob, um por linha. Acreate_db()
função salva um cache de todas as listagens de confirmação em um subdiretório no diretório atual.Algumas estatísticas dos meus experimentos em um sistema com dois processadores Intel (R) Xeon (E5) CPU E5-2620 2.00GHz apresentados pelo SO como 24 núcleos virtuais:
Observe que o script é de thread único. Portanto, apenas um núcleo seria usado por vez.
fonte
Solução Powershell para windows git, encontre os maiores arquivos:
fonte
Comece analisando, validando e selecionando a causa raiz. Usar
git-repo-analysis
para ajudar.Você também pode encontrar algum valor nos relatórios detalhados gerados pelo BFG Repo-Cleaner , que podem ser executados muito rapidamente clonando uma gota do Digital Ocean usando sua taxa de transferência de rede de 10MiB / s.
fonte
Eu me deparei com isso pela mesma razão que qualquer outra pessoa. Mas os scripts citados não funcionaram para mim. Eu fiz um que é mais um híbrido daqueles que eu já vi e agora mora aqui - https://gitlab.com/inorton/git-size-calc
fonte