Comment fusionner deux twigs avec différentes hiérarchies de répertoires dans git?

J’ai commencé à utiliser Maven avec un projet d’application Web afin de modifier la hiérarchie des répertoires. J’ai créé une nouvelle twig pour l’intégration de Maven. Maintenant, j’ai deux twigs une avec l’ancienne hiérarchie de répertoires et une avec la hiérarchie des répertoires maven. Les deux twigs ont de nouveaux commits (corrections de bogues et nouvelles fonctionnalités).

Je voudrais me débarrasser de l’ancienne twig et fusionner ses modifications avec la twig Maven. Git merge donne d’innombrables conflits qui semblent impossibles à résoudre. Je crois que c’est parce que les chemins de fichiers ont changé.

Quelle est la meilleure façon d’aborder cette fusion?

Essayez de définir merge.renameLimit à un niveau élevé pour cette fusion. git essaie de détecter les noms, mais seulement si le nombre de fichiers est inférieur à cette limite, car il nécessite un temps de traitement O (n ^ 2):

 git config merge.renameLimit 999999 

puis une fois terminé:

 git config --unset merge.renameLimit 

Le billet de blog ” Confluence, git, rename, merge oh my… ” ajoute des informations intéressantes qui illustrent la réponse de Robie (votée):

En essayant de détecter les renom, git distingue les renames exactes et inexactes avec:

  • le premier étant un renommage sans changer le contenu du fichier et
  • le dernier renommage pouvant inclure des modifications du contenu du fichier (par exemple, renommer / déplacer une classe Java).

Cette distinction est importante car l’algorithme de détection de renommage exact est linéaire et sera toujours exécuté alors que l’algorithme de détection de renommage inexact est quadratique ( O(n^2) ) et git ne le fait pas si le nombre de fichiers modifiés dépasse un certain seuil (1000 par défaut).

Lorsqu’elle n’est pas définie explicitement, merge.renameLimit défaut 1000 fichiers ou utilise la valeur de diff.renameLimit si diff.renameLimit est définie.
diff.renameLimit affecte git diff , git show et git log alors que merge.renameLimit s’applique uniquement aux tentatives de fusion ( git merge , git cherry-pick ).

C’est une bonne idée de changer le merge.renameLimit au lieu de changer le diff.renameLimit afin que git ne tente pas de trouver des noms lors d’opérations courantes, comme regarder la sortie git diff .

Pour afficher les noms, des commandes telles que git show ou git log peuvent être utilisées avec l’option -M qui active la détection de renommage.

Linus mentionne :

Oui, pour le kernel, j’ai

  [diff] renamelimit=0 

désactiver complètement la limite, car la limite par défaut est très faible. Git est assez bon à la détection de renommage.

Cependant, la raison de la faible valeur par défaut n’est pas parce qu’elle n’est pas assez vive – c’est parce qu’elle peut finir par utiliser beaucoup de mémoire (et si vous manquez de mémoire, la permutation passera de «assez rapide» à “lente comme de la mélasse” – mais ça ne sera toujours pas limité au niveau du processeur, c’est juste de la pagination comme un fou.