2014-06-11 9 views
43

Czy jest możliwe skonfigurowanie git diff w celu przestrzegania wcięć i składni? Nie mówię o ignorowaniu wcięć i spacji, ale raczej o pustych liniach, poziomach wcięć i ewentualnie nawiasach, aby dopasować stare linie do nowych linii.algorytm git diff, który nie rozdziela funkcji? (diff z różnicą językową)

E.g. git diff często przecina funkcji i ich bloku dokumentacyjnym, tak:

class C { 

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

Kiedy wolałbym

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

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

W tym przykładzie jest to nadal dość nieszkodliwe, ale istnieją przykłady, gdzie funkcje i ich bloku dokumentacyjnym są naprawdę rozdarta z powodu chciwej i naiwnej implementacji diff.

Uwaga: skonfigurowałem już *.php diff=php w ~/.gitattributes.

EDIT: Inny przykład: Tutaj git diff miesza się bloku dokumentacyjnym nieruchomości metodą w bloku dokumentacyjnym:

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

Mam podejrzenie, że odpowiedź będzie w którym algorytm diff Państwo odebrać, ale nie mogłem znaleźć taki, który pracował w sposób chcesz. – sevenseacat

+1

Jak wybrać algorytm? – donquixote

+2

Czy --patience ma coś z tym wspólnego? – donquixote

Odpowiedz

4

Nie wiem, jak to zrobić w git sam, ale istnieje co najmniej jedno narzędzie komercyjne (tj. kosztuje pieniądze), który zajmuje się tego rodzaju problemami, o nazwie SemanticMerge.

Może obsługiwać wiele ciekawych przypadków i obsługuje C#, Java i częściowo C. Możesz skonfigurować git, aby użyć go jako narzędzia scalania.

(nie jestem związany.)

+0

To może być najbliższe, co możemy dostać, tak .. – donquixote

+0

Wciąż byłoby miło mieć coś w git, które opiera się na poziomach wcięcia lub innym rodzaju oszustwa, który udaje, że jest językiem świadomym, ale tak naprawdę nie jest. – donquixote