Git diff --stat zeigt den vollständigen Dateipfad an

103

Dabei werden git diff --stateinige Dateien mit dem vollständigen Pfad von der Repository-Basis aufgelistet, einige Dateien jedoch wie folgt:

.../short/path/to/filename.  

Das heißt, der Pfad beginnt mit ...und es wird nur ein kurzer Pfad angezeigt.

Ich möchte git diffden vollständigen Dateipfad für alle Dateien auflisten, damit diese problemlos von einem Skript verarbeitet werden können. Gibt es eine Möglichkeit git diff, immer den vollen Weg zu zeigen?

Badri
quelle

Antworten:

107

Der git diffBefehl akzeptiert optionale Werte für --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Für Scripting Sie könnten verwenden mögen git diff-treedirekt , da es eher einen „Sanitär“ Befehl ist, obwohl ich vermute , dass Sie sich gut gehen oder so. Beachten Sie, dass Sie den gleichen zusätzlichen Text mit müssen --statbei der Verwendung git diff-tree. Den wesentlichen Unterschied zwischen der Verwendung von git diff„Porzellan "Front-End und der git diff-treeInstallationsbefehl git diffsuchen in Ihren konfigurierten Einstellungen nach Optionen, diff.renamesmit denen Sie entscheiden können, ob Sie eine Umbenennungserkennung durchführen möchten. Nun, das und das Front-End git diffentsprechen dem Vergleich, git diff-indexwenn Sie ein Commit mit dem Index vergleichen Mit anderen Worten, git diff liest Ihre Konfiguration und ruft automatisch die richtige Installation auf .)

torek
quelle
6
git diff --numstat ist das gleiche wie diff-tree
cmcginty
1
Beachten Sie, dass Sie einen separaten --stat-graph-width=...Schalter verwenden können, um die Breite des letzten Teils (+++ / ---) zu begrenzen . Beachten Sie auch, dass die Einstellung hoch --stat-graph-width=und --stat-name-width=nicht ausreichend ist. Sie müssen auch --stat-width=groß genug einstellen , um die beiden abzudecken.
Jakub.g
@ jakub.g: guter Punkt. Basierend auf ein wenig Graben in der Git-Quelle ging dies mit Git 1.7.10 einher.
Torek
4
Gibt es eine Möglichkeit, dies zu globalisieren? Es ist verrückt, es jedes Mal zu tippen.
Rudie
@Rudie: leider nein: Es gibt eine Konfigurationsvariable, mit der diff.statGraphWidthSie den --stat-graph-widthWert festlegen können, aber die anderen verwenden standardmäßig Ihre Terminalbreite. (Also, alternative Antwort: "Ja, machen Sie einfach Ihr Terminalfenster 1000 Spalten breit" :-))
Torek
21

Für die Skriptverarbeitung ist es möglicherweise besser, eine der folgenden Optionen zu verwenden:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Diese sind in Kombination mit der -zOption, die NULals Feldterminatoren verwendet wird, für eine robuste Skriptverarbeitung praktischer .

cmbuckley
quelle
Nach meinen Tests erhalten Sie mit diesen Befehlen nicht den vollständigen Pfad der Ressource. Im Moment sehe ich nur relative Pfade für gelöschte Dateien. Ich weiß nicht, ob dies nur für diese Dateien der Fall ist.
GCallie
1
Alle Outpu geben Pfade relativ zu zurück git rev-parse --show-toplevel. Das ursprüngliche Problem bezog sich auf abgeschnittene Pfade, was bei diffstats ein Problem darstellt, insbesondere bei langen Dateinamen oder einem niedrigen Wert für --stat-name-width. Mit den obigen Befehlen werden die Pfade nicht abgeschnitten, sondern der angeforderte "vollständige" Pfad angezeigt, wenn auch immer noch relativ zum Repository-Stammverzeichnis.
cmbuckley
18

Für Bash-Benutzer können Sie die $COLUMNSVariable verwenden, um die verfügbare Terminalbreite automatisch zu füllen:

git diff --stat=$COLUMNS

Sehr lange Pfadnamen werden möglicherweise immer noch abgeschnitten. In diesem Fall können Sie die Breite des +++ / --- Teils reduzieren, indem Sie ihn --stat-graph-widthbeispielsweise auf 1/5 der Terminalbreite beschränken:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Für eine allgemeinere Lösung können Sie die Ausgabe von verwenden tput cols, um die Terminalbreite zu bestimmen.

John Mellor
quelle
2
Gibt es eine Möglichkeit zur Globalisierung --stat=$COLUMNS,$COLUMNS? Es ist verrückt, es jedes Mal zu tippen.
Rudie
@ Rudie hinzufügen export COLUMNSzu Ihrem ~/.bashrc, und in Ihrem ~/.gitconfigunter [alias]hinzufügensmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
Benutzer151841
@ user151841 Das ändert sich nur diff. Ich möchte, dass es auch für Merges und Pulls usw. funktioniert. (Kann es dort nicht einmal manuell machen.) Ich glaube nicht, dass GIT es unterstützt.
Rudie
@Rudie Nun, nachdem das Ziehen oder Zusammenführen abgeschlossen ist, können Sie zwischen den vorherigen und den neuen Hashes unterscheiden.
user151841
2
@ user151841 Sicher, aber das Zusammenführen ergibt bereits eine statistische Zusammenfassung. Ohne Parameter / Konfiguration. Es wäre großartig, wenn alle 'Statistikzusammenfassungen' dieselbe Konfiguration verwenden würden.
Rudie
4

Es gibt eine Option --name-only: git diff --name-only. Die Option wird auch von anderen Git-Befehlen wie showund unterstützt stash.

Pfade werden mit dieser Option nicht verkürzt.

Yevhen Pavliuk
quelle
0

Ich habe den folgenden Git-Alias ​​erstellt:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Es liest die Spaltenanzahl aus dem tput colsBefehl. Standardmäßig unterscheidet es sich von master, aber Sie können optional einen anderen Zweig angeben.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
user151841
quelle
0

Eine einfache Lösung, die ich gefunden habe, war dies: (funktioniert nur unter * nix, sorry no osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Diese Version funktioniert für beide, sieht aber unter osx nicht gut aus.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
Javier Buzzi
quelle
-1

Ich habe festgestellt, dass sich das Verhalten von diff - stat irgendwo um Git 1.7.10 herum geändert hat, wo zuvor Dateipfade standardmäßig auf eine feste Breite gekürzt wurden - es wird jetzt so viel angezeigt, wie Ihr Terminalfenster zulässt. Wenn dieses Problem auftritt, stellen Sie sicher, dass Sie ein Upgrade auf 1.8.0 oder neuer durchführen.

Alex Spurling
quelle