algorithme git diff qui ne déchire pas les fonctions? (diff sensible à la langue)

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 vierges, des niveaux d’indentation et éventuellement des parenthèses pour aider à faire correspondre les anciennes lignes aux nouvelles lignes.

Par exemple, git diff coupe souvent les 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 assez inoffensif, mais il y a des exemples où les fonctions et leur docblock sont vraiment déchirés en raison de la mise en œuvre des diff voraces et naïves.

Note: J’ai déjà configuré *.php diff=php dans ~/.gitatsortingbutes .

EDIT: Autre exemple: Ici, git diff mélange une propriété docblock avec une méthode docblock:

  /** - * @var int + * @param ssortingng $str */ 

Je ne sais pas comment faire cela tout seul, mais il y a au moins un outil commercial (c.-à-d. Qu’il coûte de l’argent) qui traite ce genre de problèmes, appelé SemanticMerge .

Il peut gérer pas mal 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é.)