2014-06-11 17 views
43

Ist es möglich, git diff so zu konfigurieren, dass Einrückung und Syntax berücksichtigt werden? Ich spreche nicht über das Ignorieren von Einrückungen und Leerstellen, sondern um Leerzeilen, Einrückungsebenen und möglicherweise Klammern zu verwenden, um die alten Zeilen an neue Zeilen anzupassen.Git Diff-Algorithmus, der Funktionen nicht auseinander reißt? (sprachsensitives diff)

z. git diff schneidet oft durch Funktionen und deren Docblock, wie folgt aus:

class C { 

    /** 
+ * Goes to the bar. 
+ */ 
+ function bar() { 
+ return 'bar'; 
+ } 
+ 
+ /** 
    * Gets your foo up to date. 
    */ 
    function foo() { 

Wenn ich würde es vorziehen,

class C { 
+ 
+ /** 
+ * Goes to the bar. 
+ */ 
+ function bar() { 
+ return 'bar'; 
+ } 

    /** 
    * Gets your foo up to date. 
    */ 
    function foo() { 

In diesem Beispiel noch ganz harmlos ist, aber es gibt Beispiele, bei denen Funktionen und deren Docblock sind wirklich auseinander gerissen wegen der gierigen und naiven diff Implementierung.

Hinweis: Ich habe bereits *.php diff=php in ~/.gitattributes konfiguriert.

EDIT: Ein anderes Beispiel: Hier git diff mischt eine Eigenschaft Docblock mit einem Verfahren Docblock:

/** 
- * @var int 
+ * @param string $str 
    */ 
+0

Ich habe den Verdacht, die Antwort wird in dem Diff-Algorithmus Sie wählen, aber ich konnte man nicht finden, die in der Art und Weise gearbeitet Sie wollen. – sevenseacat

+1

Wie wählen Sie einen Algorithmus? – donquixote

+2

Hat Geduld etwas damit zu tun? – donquixote

Antwort

4

Ich weiß nicht, wie das allein in git zu tun, aber es ist zumindest ein kommerzielles Werkzeug (dh es kostet Geld), das sich mit dieser Art von Problemen beschäftigt, SemanticMerge genannt.

Es kann ziemlich viele coole Fälle behandeln und unterstützt C#, Java und teilweise C. Sie können git so konfigurieren, dass es als Merge-Tool verwendet wird.

(Ich bin nicht angeschlossen.)

+0

Das könnte so nah wie möglich kommen, ja .. – donquixote

+0

Dennoch wäre es nett, etwas in git zu haben, das auf Einrückungslevels oder einer anderen Art von Betrug basiert, die vorgibt, sprachbewusst zu sein, aber das ist es wirklich nicht. – donquixote

Verwandte Themen