Czy można uzyskać informacje o tym, ile miejsca marnuje się przez zmiany w każdym zatwierdzeniu - tak, że mogę znaleźć zatwierdzenia, które dodały duże pliki lub wiele plików. Chodzi o to, aby spróbować zmniejszyć rozmiar repozytorium git (ponowne przesłanie, a może zatwierdzenie filtrowania)git find fat commit
Odpowiedz
Zapomniałem odpowiedzieć, moja odpowiedź brzmi:
git rev-list --all --pretty=format:'%H%n%an%n%s' # get all commits
git diff-tree -r -c -M -C --no-commit-id #{sha} # get new blobs for each commit
git cat-file --batch-check << blob ids # get size of each blob
@sschuberth: Jeśli poprawnie odczytam twój skrypt, bierze pod uwagę tylko pliki, które _added_ w konkretnym zatwierdzeniu. Nie wykryje, kiedy plik znacząco się zwiększył podczas zatwierdzania. – kynan
@kynan: Masz rację, ponieważ o to prosił PO (i czego potrzebowałem). Ale łatwo jest zmienić skrypt w celu wykrycia zmodyfikowanych plików: Zasadniczo wystarczy zastąpić "A" przez "M" w wywołaniu grep. To pokaże całkowity rozmiar pliku po modyfikacji (nie liczba dodanych/usuniętych bajtów). Z przyjemnością przyjmuję żądanie ściągnięcia na GitHub, aby skrypt był bardziej ogólny. – sschuberth
Złamany link, skrypt znajduje się teraz [tutaj] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke
git cat-file -s <object>
gdzie <object>
może odnosić się do commit, blob, drzewa lub tagu.
Można to zrobić:
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
To pokaże największe pliki na dole (czwarta kolumna jest plik (blob) wielkość
Jeśli trzeba szukać w różnych gałęziach ty”. .. ll chcesz zmienić udaj się do tych nazw oddział lub umieścić to w pętli na gałęziach, znaczniki lub obroty jesteś zainteresowany
Osobiście uznało tę odpowiedź za najbardziej przydatne, gdy próbuje znaleźć dużych plików w historii repo git: Find files in git repo over x megabytes, that don't exist in HEAD
#!/bin/bash
COMMITSHA=$1
CURRENTSIZE=$(git ls-tree -lrt $COMMITSHA | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc)
PREVSIZE=$(git ls-tree -lrt $COMMITSHA^ | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc)
echo "$CURRENTSIZE - $PREVSIZE" | bc
A także proponuję użyć łatki w formacie git, aby uzyskać rozmiar zatwierdzenia (będzie dodatkowy rozmiar nagłówka poczty, ale w rzeczywistości, jeśli trzeba szybko zatwierdzić, nie jest zbyt duży - to nie jest tak ważne aby uzyskać dokładny rozmiar, + - 1K będzie dobrą dokładnością) –
git fat find N
gdzie N jest w bajtach zwróci wszystkie pliki w całości historia, która jest większa niż N bajtów.
Możesz dowiedzieć się więcej na temat git-fat tutaj: https://github.com/cyaninc/git-fat
Bummer. Próbowałem go na Git Shell dla Windows, który jest dostarczany z GitHub Desktop i polecenie nie działa, dając mi błąd. – DucRP
Wszystkie rozwiązań przewidzianych tu skupić się na rozmiary plików ale oryginalne pytanie zadane było o popełnić rozmiary, które moim zdaniem, w moim przypadku ważniejsze było znalezienie (ponieważ chciałem pozbyć się wielu małych plików binarnych wprowadzonych w pojedynczym zatwierdzeniu, którego suma stanowiła duży rozmiar, ale mały rozmiar, jeśli jest mierzony indywidualnie w pliku).
Rozwiązanie, które skupia się na popełnić rozmiary jest warunkiem here, który jest ten skrypt Perl:
#!/usr/bin/perl
foreach my $rev (`git rev-list --all --pretty=oneline`) {
my $tot = 0;
($sha = $rev) =~ s/\s.*$//;
foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) {
$blob = (split /\s/, $blob)[3];
next if $blob == "0000000000000000000000000000000000000000"; # Deleted
my $size = `echo $blob | git cat-file --batch-check`;
$size = (split /\s/, $size)[2];
$tot += int($size);
}
my $revn = substr($rev, 0, 40);
# if ($tot > 1000000) {
print "$tot $revn " . `git show --pretty="format:" --name-only $revn | wc -l` ;
# }
}
I co ja nazywam to tak:
./git-commit-sizes.pl | sort -n -k 1
- 1. git: znajdź największy commit (s)
- 2. Git submodule commit hooks
- 3. git commit directory
- 4. git commit - format?
- 5. git: usuń drugi commit
- 6. git rebase jeden commit
- 7. Git Commit Parents 'Order
- 8. Git commit date
- 9. git commit problemów
- 10. otrzymywanie znacznika commit w git
- 11. git commit zerwana strefa czasowa
- 12. Całkowicie przesuń poprzedni commit git
- 13. Git big commit best practices
- 14. Git - Usuń commit z historii
- 15. git commit komentarz za plik
- 16. Git: Zobacz mój ostatni commit
- 17. Git commit, który nie zastępuje oryginalnych autorów w git winnie
- 18. Jak obliczyć FAT
- 19. Jak przenieść commit pomiędzy gałęziami w Git?
- 20. Git rebase interactive ostatnie n commit
- 21. Czy można "git pull" tylko następny commit?
- 22. Git, Jak zresetować origin/master do commit?
- 23. git cherry-pick branchless commit na zdalnym
- 24. git submodule init nie ciągnie najnowszego commit
- 25. Czy istnieje Bazar równoważny `git commit --amend`?
- 26. Git post commit: skip --amend i rebase
- 27. Jak mogę usunąć commit do git
- 28. Reorder git commit historię według daty
- 29. Dodaj git commit SHA do aplikacji iOS
- 30. git commit - ustawianie znaczników czasu w przyszłości
Rozważ prostu działa 'git gc' sporadycznie , prawdopodobnie jako 'git gc --aggressive' – Hasturkun
' git gc' (i 'git gc --prune'); "--aggresive" może nawet dać gorsze wyniki (ale zazwyczaj nie powinno) i zwykle nie jest tego warte. –
Ta odpowiedź jest znacznie lepsza: http://stackoverflow.com/a/10847242/520567 – akostadinov