Ist es möglich, den Gesamtunterschied der Dateigröße zwischen zwei Commits anzuzeigen? Etwas wie:
$ git file-size-diff 7f3219 bad418 # I wish this worked :)
-1234 bytes
Ich habe es versucht:
$ git diff --patch-with-stat
Und das zeigt den Unterschied in der Dateigröße für jede Binärdatei im Diff - aber nicht für Textdateien und nicht den Gesamtunterschied in der Dateigröße.
Irgendwelche Ideen?
Antworten:
git cat-file -s
gibt die Größe eines Objekts in Git in Byte aus.git diff-tree
kann Ihnen die Unterschiede zwischen einem Baum und einem anderen sagen.Wenn Sie dies in einem Skript zusammenfassen, das
git-file-size-diff
sich irgendwo auf Ihrem Pfad befindet, können Sie es aufrufengit file-size-diff <tree-ish> <tree-ish>
. Wir können so etwas wie das Folgende versuchen:#!/bin/bash USAGE='[--cached] [<rev-list-options>...] Show file size changes between two commits or the index and a commit.' . "$(git --exec-path)/git-sh-setup" args=$(git rev-parse --sq "$@") [ -n "$args" ] || usage cmd="diff-tree -r" [[ $args =~ "--cached" ]] && cmd="diff-index" eval "git $cmd $args" | { total=0 while read A B C D M P do case $M in M) bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;; A) bytes=$(git cat-file -s $D) ;; D) bytes=-$(git cat-file -s $C) ;; *) echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\" continue ;; esac total=$(( $total + $bytes )) printf '%d\t%s\n' $bytes "$P" done echo total $total }
Im Gebrauch sieht dies wie folgt aus:
Durch die Verwendung
git-rev-parse
sollten alle üblichen Methoden zum Festlegen von Festschreibungsbereichen akzeptiert werden.BEARBEITEN: aktualisiert, um die kumulierte Summe aufzuzeichnen. Beachten Sie, dass bash das while-Lesen in einer Unterschale ausführt, daher die zusätzlichen geschweiften Klammern, um zu vermeiden, dass beim Verlassen der Unterschale die Summe verloren geht.
BEARBEITEN: Unterstützung für den Vergleich des Index mit einem anderen Baum hinzugefügt, indem stattdessen ein
--cached
Argument zum Aufrufengit diff-index
verwendet wirdgit diff-tree
. z.B:quelle
git-sh-setup
hier? Sie scheinen keine der darin definierten Funktionen zu verwenden . Ich wundere mich nur!curl -s https://gist.githubusercontent.com/cschell/9386715/raw/43996adb0f785a5afc17358be7a43ff7ee973215/git-file-size-diff | bash -s <tree-ish> <tree-ish>
git rev-parse
daher die vollständigen Details im Handbuchabschnitt "Festlegen von Revisionen" in der git-rev-parse-Dokumentation. ( git-scm.com/docs/git-rev-parse )Sie können die Ausgabe auspfeifen
und vergleiche die 2 Zahlen.
quelle
| wc -c
wenn Siecat-file -s
anstelle vonshow
gdbytes () { echo "$(git cat-file -s $1:$3) -> $(git cat-file -s $2:$3)" }
ist es leicht zu sehen, wie sich die Dateigröße seit dem letztengdbytes @~ @ index.html
some-ref:
Teil übersprungen wird, erhalten Sie die Dateigröße im Arbeitsverzeichnis?Ich habe ein Bash-Skript erstellt, um Zweige / Commits usw. nach der tatsächlichen Datei- / Inhaltsgröße zu vergleichen. Es kann unter https://github.com/matthiaskrgr/gitdiffbinstat gefunden werden und erkennt auch das Umbenennen von Dateien.
quelle
Aufbauend auf matthiaskrgr Antwort , https://github.com/matthiaskrgr/gitdiffbinstat kann wie die anderen Skripten verwendet werden:
Imo es funktioniert wirklich gut, viel schneller als alles andere hier gepostet. Beispielausgabe:
Das Ausgabeverzeichnis ist funky mit ./c/data ... da / c eigentlich das Dateisystemstamm ist.
quelle
Ein Kommentar zum Skript: git-file-size-diff, vorgeschlagen von patthoyts. Das Skript ist sehr nützlich, ich habe jedoch zwei Probleme gefunden:
Wenn jemand die Berechtigungen für die Datei ändert, gibt git einen anderen Typ in der case-Anweisung zurück:
Wenn (aus irgendeinem Grund) kein sha-1-Wert mehr vorhanden ist, stürzt das Skript ab. Sie müssen den sha validieren, bevor Sie die Dateigröße erhalten:
$(git cat-file -e $D) if [ "$?" = 1 ]; then continue; fi
Die vollständige case-Anweisung sieht dann folgendermaßen aus:
quelle