2014-06-11 1 views
43

Est-il possible de configurer git diff pour respecter l'indentation et la syntaxe? Je ne parle pas d'ignorer l'indentation et les espaces, mais plutôt d'utiliser des lignes vides, des niveaux d'indentation et éventuellement des crochets, pour aider à faire correspondre les anciennes lignes à de nouvelles lignes.git diff algorithme qui ne déchire pas les fonctions? (Différent de langue)

E.g. git diff coupe souvent des fonctions et leur docblock, comme ceci:

class C { 

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

Quand je préférerais

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

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

Dans cet exemple, il est encore tout à fait inoffensif, mais il existe des exemples où les fonctions et leur docblock sont vraiment déchiré en raison de la mise en œuvre diff diffuse et naïf. Remarque: J'ai déjà configuré *.php diff=php dans ~/.gitattributes.

EDIT: Un autre exemple: diff Ici git mélange un docblock de propriété avec une méthode docblock:

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

Je soupçonne que la réponse sera dans l'algorithme diff que vous choisissez, mais je ne pouvais pas trouver un qui a travaillé dans la façon dont vous voulez. – sevenseacat

+1

Comment choisissez-vous un algorithme? – donquixote

+2

Est-ce que --patience a quelque chose à voir avec ça? – donquixote

Répondre

4

Je ne sais pas comment faire cela dans git seul, mais il y a au moins un outil commercial (c'est-à-dire qu'il en coûte de l'argent) qui traite de ce genre de problèmes, appelé SemanticMerge.

Il peut gérer beaucoup de cas cool, et supporte C#, Java, et partiellement C. Vous pouvez configurer git pour l'utiliser comme outil de fusion.

(je ne suis pas affilié.)

+0

Cela pourrait être le plus proche que nous pouvons obtenir, oui .. – donquixote

+0

Encore ce serait bien d'avoir quelque chose en git qui est basé sur des niveaux d'indentation ou d'autres tricheries, qui prétend être conscient de la langue mais qui ne l'est pas vraiment. – donquixote