2016-11-04 2 views
0

Ich untersuche die git interaktiven Funktionen, von denen die wichtigste für mich ist die Kombination und Auswahl der hunks. Es funktioniert sehr gut, aber ich brauche die Kerle, um kleiner zu sein. Bei der Arbeit mit Quellcodedateien enthält das Brocken häufig zwei verschiedene Änderungen, die nicht miteinander verwandt sind (normalerweise einige Zeilen voneinander entfernt). Dies ist wahrscheinlich, weil git die hunks mit einer bestimmten Konfiguration erkennt, wie z. B. Linien auseinander, oder Menge von Zeichen oder so ähnlich.GIT: wie die hunks Erkennung zu konfigurieren

Ist das korrekt, und wenn ja, gibt es eine Möglichkeit, dieses Verhalten zu ändern/neu zu konfigurieren?

Vielen Dank,

+1

siehe http://stackoverflow.com/questions/1122210/can-i-modify-git-adds-hunk-size – pedrorijo91

+0

Danke pedrorijo91, nicht das, was ich suche. – repara2

Antwort

2

Wenn Sie einfach nur git diff beziehen, die große Stück Kontextgröße ist konfigurierbar: es über die -U Option gesetzt, falls angegeben, sonst von Ihrer diff.context Einstellung, wenn gesetzt. Wenn all dies fehlschlägt, ist der Standard drei Zeilen Kontext (oben und unten).

Daraus folgt:

$ git config --global diff.context 1 

reduziert den diff Kontext in jede Richtung auf eine Linie, statt 3. Es gibt auch einen --inter-hunk-context Option Wert, den Sie mehr große Stücke verschmelzen verwenden können, um (das ist das Gegenteil von was Sie wollen, so erwähne ich es nur der Vollständigkeit halber, siehe diff.interHunkContext, verfügbar in Git 2.12 und später, und siehe auch --function-context aka -W).

jedoch git add --interactive läuft git diff-files oder git diff-index eher als Normal git diff und als the git config documentation cleverly hides:

diff.autoRefreshIndex

            Wenn mit git diff mit Arbeit Baum Dateien zu vergleichen, Berücksichtigen Sie nicht, dass sich Änderungen nur als geändert ändern. Führen Sie stattdessen im Hintergrund git update-index --refresh aus, um die zwischengespeicherten Statistikinformationen für Pfade zu aktualisieren, deren Inhalt im Arbeitsbaum mit den Inhalten im Index übereinstimmt. Diese Option ist standardmäßig wahr. Beachten Sie, dass dies betrifft nur git diff Porzellan, und nicht niedrigere Ebene diff Befehle wie git diff-Dateien.

(Fettdruck Betonung meins).

Obwohl dies die diff.autoRefreshIndex Einstellung spricht über, gilt es für alle der konfigurierbaren Elemente: git diff liest und gehorcht der Konfiguration, aber git diff-index und git diff-files und so weiter nicht (absichtlich, so dass Skripte, die Sanitär verwenden sollten Befehle statt Porzellan, kann das richtige Verhalten unabhängig von neu hinzugefügten Optionen erhalten).

Das bedeutet am Ende, dass, wenn Sie speziell auf git add --interactive beziehen, die Antwort ist nicht, oder eher nicht ohne ein bisschen Arbeit. Das interaktive Perl-Skript zum Hinzufügen verwendet die Sanitärbefehle, nicht das Porzellan git diff, so dass es eine solche Einstellung selbst erhalten und verwenden muss.Es tut erhalten und verwenden Sie Ihre diff.algorithm und diff.compactionHeuristic Einstellungen, aber es tut nicht verwenden Sie Ihre diff.context Einstellung.

es so zu machen tun ist einfach, aber erfordert Modifizierung leicht Git:

diff --git a/usr/local/libexec/git-core/git-add--interactive b/tmp/git-add--interactive 
index 235fb88..ba001a1 100755 
--- a/usr/local/libexec/git-core/git-add--interactive 
+++ b/tmp/git-add--interactive 
@@ -47,2 +47,3 @@ my $normal_color = $repo->get_color("", "reset"); 

+my $diff_context_size = $repo->config('diff.context'); 
my $diff_algorithm = $repo->config('diff.algorithm'); 
@@ -753,2 +754,6 @@ sub parse_diff { 
     } 
+  if (defined $diff_context_size) { 
+    my $Uarg = sprintf("-U%d", $diff_context_size); 
+    splice @diff_cmd, 1, 0, "$Uarg"; 
+  } 
     if ($diff_compaction_heuristic) { 

(es kann eine bessere Möglichkeit, das -U Argument einzurichten, mein Perl ungeschickt ist). Der interaktive Patch (oder git add -p) -Modus benötigt dieses Snippet hinzugefügt, wenn es Ihre diff.context Einstellung gehorchen soll.

Natürlich können Sie einfach split (s) ein großes Stück bei der interaktiven Zusatz, wie pedrorijo91 reminded us in a comment-Can I modify git-add's hunk size? Verknüpfung, also gibt es keine wirkliche Notwendigkeit dafür. Es könnte aber auch schön sein, wenn es dabei wäre.

+0

Genau das, was ich gesucht habe, vielen Dank. – repara2

+0

"Es gibt auch einen' --inter-hunk-context' Optionswert (ohne entsprechendes Konfigurationselement) "... nun, es gibt jetzt (Git 2.12): Siehe [commit c488867] (https: // github. com/git/git/commit/c488867793dc9b273c1d35746452d44afcd3d7f5) (12.1.2017) von [Vegard Nossum ('vegard')] (https://github.com/vegard). (Zusammengeführt von [Junio ​​C Hamano - 'gitster' -] (https://github.com/gitster) in [commit 8ec68d1] (https://github.com/git/git/commit/8ec68d1ae2863823b74d67c5e92297e38bbf97bc), 23. Januar 2017). – VonC

+0

@VonC: aktualisiert, danke. – torek

Verwandte Themen