Ist es möglich, Informationen darüber zu erhalten, wie viel Speicherplatz durch Änderungen in jedem Commit verschwendet wird - so kann ich Commits finden, die große Dateien oder viele Dateien hinzugefügt haben. Dies ist alles zu versuchen, git Repo Größe (Rebasing und vielleicht Filter Commits)git find fat commit
Antwort
antworten vergessen zu, meine Antwort ist:
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: Wenn ich Ihr Skript richtig gelesen, berücksichtigt es nur Dateien, die _added_ in einem bestimmten Commit waren. Es wird nicht erkannt, wenn eine Datei bei einem Commit wesentlich angewachsen ist. – kynan
@kynan: Du hast Recht, denn das hat das OP verlangt (und was ich gebraucht habe). Es ist jedoch einfach, das Skript so zu ändern, dass geänderte Dateien erkannt werden: Im Prinzip müssen Sie im Grep-Aufruf nur "A" durch "M" ersetzen. Dadurch wird die Gesamtdateigröße nach der Änderung gemeldet (nicht die Anzahl der hinzugefügten/entfernten Bytes). Ich würde gerne eine Pull-Anfrage auf GitHub akzeptieren, um das Skript generischer zu machen. – sschuberth
Unterbrochener Link, das Skript befindet sich jetzt [hier] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke
git cat-file -s <object>
wo <object>
kann beziehen sich auf eine Festschreibung, Blob, Baum oder Tag.
Sie können dies tun:
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
Dadurch werden die größten Dateien auf der Unterseite zeigen (vierte Spalte ist die Datei (Klecks) Größe
Wenn Sie an verschiedenen Zweigen suchen müssen Sie‘. .. ll will HEAD zu diesem Zweig Namen ändern oder diese über die Zweige, Tags in einer Schleife setzen oder Drehzahlen Sie interessiert sind
Persönlich fand ich diese Antwort sehr hilfreich zu sein, wenn große Dateien in der Geschichte eines git Repo zu finden versuchen: 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
Und ich schlage vor, git format-patch zu verwenden, um commit-Größe zu erhalten (es wird einige zusätzliche Größe für E-Mail-Header, aber tatsächlich, wenn Sie schnell Commit benötigen ist nicht zu groß - es ist nicht so wichtig um genaue Größe zu erhalten, wird + - 1K eine gute Genauigkeit sein) –
git fat find N
wobei N in Bytes wird wieder alle Dateien im gesamten Geschichte, die größer als N Bytes sind.
Sie können hier mehr über git-Fett herausfinden: https://github.com/cyaninc/git-fat
Bummer. Ich habe es auf der Git Shell für Windows ausprobiert, die mit GitHub Desktop geliefert wird, und der Befehl hat nicht funktioniert und gab mir einen Fehler. – DucRP
Alle Lösungen hier bereitgestellten konzentrieren sich auf Dateigrößen aber die ursprüngliche Frage gestellt war etwa Größen begehen, die meiner Meinung nach, und In meinem Fall war es wichtiger zu finden (weil, was ich wollte, ist, viele kleine Binärdateien loszuwerden, die in einem einzigen Commit eingeführt wurden, was zusammenfassend viel Größe bedeutet, aber eine kleine Größe, wenn sie einzeln durch Datei gemessen wird).
Eine Lösung, die Größen auf verpflichten konzentriert sich die here vorgesehen ist, die das Perl-Skript ist:
#!/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` ;
# }
}
Und was ich so nennen:
./git-commit-sizes.pl | sort -n -k 1
- 1. git commit -m vs. git commit -am
- 2. Verwenden von find() mit mehreren Filtern Fat Free Framework
- 3. git find unmerged Zweigniederlassungen
- 4. Git Look Commit-Protokoll für Commit-ID
- 5. Git entfernen Geschichte Commit
- 6. Git submodul commit hooks
- 7. Git "fehlende" Commit
- 8. delete first git commit
- 9. Git: Fortschrittsbalken beim Commit?
- 10. Git undo Last commit
- 11. git commit - Format?
- 12. Lost Last Git Commit
- 13. git commit defekte Zeitzone
- 14. Git commit Nachricht voranstellen
- 15. git commit queue tool
- 16. Git Commit Eltern bestellen
- 17. git commit -a/nano
- 18. Gibt es einen "git find"?
- 19. git commit oder Git Stash Fehler
- 20. git: push ein einzelnes commit
- 21. alle Git löscht Geschichte Commit
- 22. git rebase ein single commit
- 23. Referenz Git-Zweig Start-Commit
- 24. Intellij Git ein Commit zurück
- 25. Intercept "git commit -a (m)"
- 26. Wie git-notes commit löschen?
- 27. Commit-Nachrichtenformat in Git erzwingen
- 28. Get Git Repository letzten Commit
- 29. fehlendes Commit in Git/Gerrit
- 30. GIT Log oder Commit Monitor
einfach Erwägen Sie 'git gc' gelegentlich , möglicherweise als "git gc --aggressive" – Hasturkun
'git gc' (und' git gc --prune'); '--aggresive' kann sogar schlechtere Ergebnisse liefern (sollte aber normalerweise nicht) und ist es normalerweise nicht wert. –
Diese Antwort ist viel besser: http://stackoverflow.com/a/10847242/520567 – akostadinov