2014-06-11 5 views
43

È possibile configurare git diff per rispettare indentazione e sintassi? Non sto parlando di ignorare indentazione e spazi, ma piuttosto di usare righe vuote, livelli di indentazione e possibilmente parentesi, per aiutare ad abbinare le vecchie linee a nuove linee.Algoritmo git diff che non strappa le funzioni a parte? (diff. lingua)

E.g. git diff spesso attraversa funzioni e la loro docblock, in questo modo:

class C { 

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

Quando io preferirei

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

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

In questo esempio è ancora abbastanza innocuo, ma ci sono esempi in cui funzioni e la loro docblock sono davvero squarciato a causa della ingorda e ingenua implementazione della diff.

Nota: ho già configurato *.php diff=php in ~/.gitattributes.

EDIT: Un altro esempio: diff Qui git mescola un docblock proprietà con un metodo di docblock:

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

Ho il sospetto la risposta sarà in cui l'algoritmo diff si sceglie, ma non riuscivo a trovare uno che ha lavorato nel modo desiderato. – sevenseacat

+1

Come scegli un algoritmo? – donquixote

+2

La pazienza ha qualcosa a che fare con questo? – donquixote

risposta

4

non so come fare a git solo, ma c'è almeno uno strumento commerciale (cioè costa soldi) che si occupa di quel tipo di problemi, chiamato SemanticMerge.

Può gestire molti casi interessanti e supporta C#, Java e parzialmente C. È possibile configurare git per utilizzarlo come strumento di unione.

(Io non sono affiliati.)

+0

Questo potrebbe essere il più vicino che possiamo ottenere, sì .. – donquixote

+0

Ancora sarebbe bello avere qualcosa in git che si basa su livelli di indentazione o qualche altro tipo di imbroglio, che finge di essere consapevole della lingua, ma in realtà non lo è. – donquixote