git diff --no-index aber mit mehreren Dateien

1454
Alec

Ich mag das Ausgabeformat von git diff sehr, und ich verwende es häufig git diff --no-index, um beliebige, nicht mit git zusammenhängende Dateien zu vergleichen. Soweit ich feststellen kann, dass Sie --no-index verwenden, können Sie nur ein einziges Paar von Dateien angeben. Ich möchte wirklich gerne mehrere Paare übergeben, wie:

git diff --no-index a.new a.old b.new b.old 

Und erhalten Sie die Art der Ausgabe, die Sie durch das Ausführen git diffeines Repos erhalten würden:

diff --git a/a b/a index e965047..ce01362 100644 --- a/a +++ b/a @@ -1 +1 @@ -Hello +hello diff --git a/b b/b index 2b60207..dd7e1c6 100644 --- a/b +++ b/b @@ -1 +1 @@ -Goodbye +goodbye 

Gibt es eine Möglichkeit, dies mit git diff oder einem ähnlichen Werkzeug zu tun?

4

2 Antworten auf die Frage

2
Jaap Eldering

Da git diff --no-indexauch zwei Verzeichnisse akzeptiert und diese verglichen werden, können Sie immer ein Wrapper-Skript darauf schreiben und Ihre Dateien in zwei temporäre Verzeichnisse kopieren.

Abgesehen davon kenne ich kein Diff-Tool, das mehrere Paare von Dateien zum Vergleich akzeptiert. Akzeptiert auch diffnur ein einzelnes Paar von Dateien oder ein Verzeichnis und eine Liste von Dateien.

Oh, ich wusste nicht, dass es Verzeichnisse akzeptierte. Das ist wahrscheinlich gut genug für mich. Ich würde eine Lösung vorziehen, bei der die Dateinamen nicht unbedingt übereinstimmen mussten (dh in den beiden Verzeichnissen), aber ich kann damit wahrscheinlich leben. Alec vor 8 Jahren 0
@Alec Mit dem Aufkommen (in Jahren später in Version 2.15) von 'diff.colorMoved' in den Konfigurationsoptionen sollte die Übereinstimmung der Dateinamen weniger wichtig sein. Es wird immer noch '+' und '-' Zeilen geben, aber sie werden farbig dargestellt, um zu zeigen, dass sie im selben Unterschied von einem anderen Ort kamen. Michael vor 5 Jahren 0
@Michael Ich habe versucht es zu finden, aber ich konnte nicht finden, wie ich mit normalem GNU-Diff (1) das machen kann, was OP will. Ich habe Version v3.6 (weitaus neuer als die v2.15, die Sie erwähnen). Ich kann es nur scheinen, FILE1 FILE2, nicht FILE1 FILE2 FILE3 ... (paarweise). Aktau vor 5 Jahren 0
@Aktau Die Version, die ich erwähnt habe, war für Git (und den dazugehörigen `git diff`). Eine ausführlichere Erklärung finden Sie unter [meine Antwort] (https://superuser.com/a/1343927/23156). Michael vor 5 Jahren 0
Danke für die Antwort @Michael. Mein Problem (und das OP-Problem, denke ich) ist, dass unsere Dateien nicht in Git verfolgt werden. Wir verwenden einfach git-diff (1) für die Ausgabe. Aktau vor 5 Jahren 0
1
Michael

Dies sind im Wesentlichen zwei kontextabhängige Versionen von Jaaps Antwort, jede mit einem Bonus.

Komplette oder fast komplette Sätze

Sie haben einige Dateien in einem Verzeichnis A, die Sie mit anderen Dateien vergleichen möchten. Wenn die Menge der Dateien, mit denen Sie sie in B vergleichen möchten, nahezu identisch ist, setzen Sie einfach git config --global diff.colorMoved trueJaaps Vorschlag:

git diff --no-index A/ B/ 

Die "Farbe verschoben" wird eine andere Linienfarbe verwenden, wenn von einer Stelle entfernte Linien an anderen Stellen im Diff angezeigt werden, unabhängig davon, ob sie mit der Datei verschoben wurden oder in eine andere Datei verschoben wurden, wie in einem Refactor.

Spezifische Dateien zum Vergleichen

Wenn es nur eine Handvoll Dateien in B und viele Dateien in A gibt,

┌ A | ├ (various folders) | └ src | ├ (various files) | ├ foo.c | └ bar.c └ B ├ new-foo.c └ new-bar.c 

... Sie können versuchen, die Umbenennung von Git die Arbeit erledigen zu lassen. Ich weiß nicht, welche Version von Git den erforderlichen Grad an Umbenennungs-Tracking hinzufügt (ich verwende Version 2.18). Die Tests, die ich durchführte, waren mit einer ziemlich trivialen Sammlung von Dateien.

Sie möchten nicht wirklich sehen, dass die Mehrheit der Dateien in B "fehlt". Außerdem möchten Sie nicht, dass Sie den Dateien und Namen von B denselben Namen / Pfad wie in A geben Fügen Sie einen Filter ein, der umbenannte und geänderte Dateien enthält.

git diff --no-index --diff-filter=RM A/ B/ 
diff --git a/A/src/foo.c b/B/new-foo.c similarity index 65% rename from A/src/foo.c rename to B/new-foo.c index dd51990..64445b1 100644 --- a/A/src/foo.c +++ b/B/new-foo.c @@ -1,4 +1,4 @@ octopus cow -dog tiger +flamingo  diff --git a/A/src/bar.c b/B/new-bar.c similarity index 87% rename from A/src/bar.c rename to B/new-bar.c ...