Wie bekomme ich Git Diff mit vollem Kontext?


114

Wie erstelle ich einen Patch, der für die Überprüfung im Tiegel geeignet ist?

git diff branch master --no-prefix > patch

Dies erzeugt nur 3 Kontextzeilen. Also mache ich folgendes

git diff --unified=2000 branch master --no-prefix > patch

Hoffentlich haben alle Dateien weniger als 2000 Zeilen. Gibt es eine Möglichkeit, git anzuweisen, alle Zeilen in die Datei für den Patch aufzunehmen, ohne maximale Zeilen angeben zu müssen?


3
Ich habe die Option -U <Infinity> gepostet, um die gesamte Datei als separate Frage anzuzeigen. Stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Antworten:


54

Ich weiß, dass dies alt ist, aber ich mag auch keine hartcodierten Lösungen, deshalb habe ich Folgendes getestet:

git diff -U$(wc -l MYFILE)

Die Verwendung von -U scheint der einzige Weg zu sein, um das Problem anzugehen, aber die Verwendung einer Zeilenanzahl verspricht, dass es auch für eine kleine Änderung in einer sehr großen Datei funktioniert.


1
<ist nicht nötig. git diff -U$(wc -l MYFILE) MYFILE
Balki

2
Vielen Dank an @balki, ich habe Ihren Vorschlag ausprobiert und festgestellt, dass <pre> $ (wc -l MYFILE) </ pre> auf die Zeilenanzahl gefolgt vom Dateinamen erweitert wird, sodass auch die zweite Verwendung des Dateinamens weggelassen werden kann. Ich aktualisiere meine Antwort, um dies widerzuspiegeln.
Esra

4
Es ist ein Unterschied, es gibt zwei Versionen der Datei. Was ist, wenn die Version nicht auf der Festplatte doppelt so lang war? Ist -U mit einer wirklich großen Anzahl nicht wirklich sicherer?
Eloff

@ Eloff, das stimmt, der beste Weg wäre, die Längen zu maximieren, da wirklich große Zahlen immer noch das gegenteilige Problem haben. Bei dieser Lösung wird davon ausgegangen, dass keine zusammenhängenden Löschungen vorgenommen wurden, die größer als die aktuelle Dateigröße auf der Festplatte sind.
Esra

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEist eine bessere Antwort, die die Ausgabe korrekt analysiert, wcindem nur die Anzahl der Zeilen ohne Leerzeichen abgerufen wird, ohne sich auf die nicht zitierte Ausgabe einer Unterschale zu verlassen, um zwei Argumente zu erstellen, und unter macOS / BSD funktioniert.
Anishpatel

94

Das scheint ganz gut zu funktionieren:

git diff --no-prefix -U1000

Mit dem Vorbehalt:

Das -UFlag gibt Kontextzeilen an. Möglicherweise müssen Sie diesen Wert erhöhen, wenn zwischen Ihren Änderungen mehr als 1000 Zeilen liegen.


16
Die von -UIhnen vorgeschlagene --unified=Option entspricht der vom Fragesteller verwendeten Option. Der einzige Unterschied besteht darin, dass Sie weniger Kontextzeilen (1000) angeben als der verwendete Fragesteller (2000). @Balki wollte wissen, wie die Zahl auf unendlich erhöht werden kann, aber Sie schlagen vor, die Zahl zu halbieren. Warum?
LS

4
@ LS: Ja, das merke ich jetzt, habe das aber vor ein paar Jahren übersehen. Trotzdem ist es etwas offensichtlicher, was los ist als in der Frage und scheint der seltsamen Person zu helfen, die hier landet.
c24w

Danke dafür, es funktioniert auch super mit git show!
Shakeel

@ c24w Einverstanden, bekommt mir immer noch was ich auf dem Bildschirm sehen will.
Chef Pharao

1
Mit dieser --no-prefixOption werden die standardmäßig angezeigten Zielpräfixe "/ a /" und "/ b /" entfernt. (verlinkte Seite)
Luckydonald

10

Hinweis: Die Ankündigung von git1.8.1rc1 (8. Dezember 2012) enthält:

Eine neue Konfigurationsvariable " diff.context" kann verwendet werden, um die Standardanzahl von Kontextzeilen in der Patch-Ausgabe anzugeben und die fest codierte Standardeinstellung von 3 Zeilen zu überschreiben.

Dies könnte hier helfen, einen vollständigeren Kontext zu generieren.


7
Das hat jedoch keine Option, "Alle Zeilen in der Datei" zu sagen
balki

3
Ich vermute, dass das Setzen einer großen Zahl "alle Zeilen" simulieren würde
VonC

7
"Ich vermute, dass das Setzen einer großen Zahl" alle Zeilen "simulieren würde ..." außer wenn dies nicht der Fall ist und dann die Dinge kaputt gehen. Alles ist gleichbedeutend mit unendlich, und eine sehr große Zahl ist genau das - eine Zahl, nicht unendlich.
Trenton

4

Ich habe mich inspirieren lassen und deshalb habe ich einen Git-Alias ​​hinzugefügt.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

Aktualisieren:

Gerade gefunden "git df" funktioniert manchmal nicht, da das Verzeichnis beim Ausführen des Git-Alias ​​geändert wurde. (Siehe Git-Aliase arbeiten im falschen Verzeichnis ). Das ist also die aktualisierte Version:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

Zuvor akzeptierte Lösungen funktionieren bei mir nicht, wenn eine bestimmte Datei / ein bestimmtes Commit angezeigt wird (die -UOption scheint mit der Analyse von Revisionen / Pfaden in Konflikt zu geraten), --inter-hunk-context=funktioniert jedoch in diesem Fall unter folgenden Bedingungen git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Wenn Sie die Dateigröße nicht kennen, können Sie sie natürlich finden, wc -lanstatt sie fest zu codieren:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.