2012-09-14 9 views
19

Ich möchte Git Geduld Differential-Algorithmus (der, den Sie erhalten, wenn Sie git diff mit dem --patience Argument aufrufen) mit git add -p. Wie kann ich das machen?Verwenden Sie Git's Geduld Diff-Algorithmus für interaktive hinzufügen

Hintergrund: Ich arbeite mit einigen XML-Dateien und git diff 's normalen Algorithmus produces pretty poor diffs due to "misaligned" entry/exit tags. Wenn ich git diff --patience starte, bekomme ich viel nützlichere Diffs, aber es gibt keinen offensichtlichen Weg, diese Diffs in git add -p zu verwenden.

+3

Ich bin mir nicht sicher, dass Sie das jetzt tun können, aber es klingt wie ein guter Vorschlag, den 'Git'-Entwicklern zu machen ... Tatsächlich könnte es andere' git diff'-Optionen geben, die nützlich wären um 'git add' und andere Orte zu exponieren, wo sonst ein default-ish' git diff' gemacht wird ... – twalberg

+0

siehe diese Zeile im Code: https://github.com/git/git/blob/master/builtin /add.c#L273 – greg0ire

Antwort

30

git add -p derzeit lehnt diff Flaggen, aber Sie können die diff.algorithm Konfigurationsoption verwenden:

git config --global diff.algorithm patience 

Neu in Git 1.8.2.

+1

Süß! Jetzt muss ich nur auf Cygwin Git warten, um aufzuholen ... –

+0

Sollte es auch Algorithmus für Git commit ändern? – fantastory

4

Hmmmm ... Eine Sache, die Sie tun können, ist die Ausgabe des git diff an einen temporären Ort, es dann in mit git apply lesen zurück:

git diff --patience <commitA> <commitB> > /tmp/patch.out 
# checkout a new branch or otherwise do what you need to prep 
git apply < /tmp/patch.out 

Das wird die Ausgabe des diff auf die Anwendung Arbeitsverzeichnis, aber es wird nicht festgeschrieben oder die Änderungen durchgeführt. Sie können dann git add -p wie gewohnt ausführen, und die --patience diff sind die Änderungen, die Sie interaktiv hinzufügen.

Es gibt keinen Grund, warum Sie diff nicht direkt an apply senden könnten, wenn es besser zu Ihrem Workflow passt. Es ist etwas, was ich ziemlich regelmäßig mache, wenn ich meine eigenen lokalen Niederlassungen für die Produktionsintegration neu aufbaut.

Sieht aus wie Sie es auch als merge strategy, verwenden können, so könnte es der Fall sein, dass statt interaktiv die diffs Hinzufügen Sie einfach einen Zweig erstellen könnte mit dem, was Sie wollen, dann verschmelzen sie in.

+0

Das mache ich gerade; Ich kann den Patch bearbeiten, was ich im Wesentlichen mit 'git add -p' machen möchte. Dies scheint nur leider mühsamer als es sein sollte. –

+0

@me_and Einige Anmerkungen zur Verwendung als Merge-Strategie hinzugefügt. Vielleicht könnten Sie einen Trash-Merge-Zweig mit den gewünschten Änderungen erstellen und dann die Merge-Strategie verwenden, um ein besseres Ergebnis zu erzielen. – Christopher

10

Das ist für mich gearbeitet:

git -c diff.algorithm=patience add -p [...] 

ich die neueste git v2.1.0 in Cygwin leite.

+2

Ja, wie bereits in der angenommenen Antwort von @Tobu angemerkt wurde, wurde dieses Konfigurations-Flag in Git v1.8.2 hinzugefügt. Es stellt sich heraus, dass der Weg, ein aktuelles Git-Build auf Cygwin zu bekommen, darin besteht, das Maintainship zu übernehmen, was genau das ist, was ich getan habe :) –

+0

@me_and: Dann muss ich dir dafür danken, endlich aktualisierte Versionen von Cygwin Git :) Es war für einige Zeit inaktiv. Was meine Antwort angeht, wollte ich nur zeigen, dass es möglich ist, eine Konfiguration inline zu ändern, ohne globale Konfigurationen zu ändern. – Amro

+1

@me_und das Interessante hier ist, dass diese Konfigurationsoption nur temporär ist und als cli-flag auf diese Weise übergeben werden kann – ohcibi