
Andrew Hanna

Andrew Hanna

En bref : Un merge driver est un programme que git appelle à la place
de sa propre fusion ligne à ligne, pour les motifs de fichiers que vous désignez.
Pointez-en un vers vos métadonnées Salesforce dans .gitattributes,
déclarez-le dans la config git de chaque clone, et les changements de nœuds XML
indépendants fusionnent seuls au lieu d'arriver sous forme de marqueurs de conflit.
C'est un réglage par clone, il faut donc une étape d'amorçage, et il ne s'exécute
jamais sur le bouton de fusion de votre hébergeur.
Ceci est le guide de mise en place, pas le guide de résolution. Si vous avez déjà des marqueurs de conflit sous les yeux, lisez d'abord Résoudre les conflits de métadonnées Salesforce sans perdre le travail de personne, puis revenez ici pour éviter la prochaine fournée.
Lors d'une fusion à trois voies, git a besoin de trois versions du fichier : l'ancêtre commun, votre côté et le côté entrant. Par défaut il les réconcilie ligne à ligne. Un merge driver remplace cette étape par une commande de votre choix, et git lui passe les trois versions sous forme de fichiers temporaires.
Le contrat est court. Git substitue les placeholders dans votre ligne de commande :
%O la version ancêtre commune%A votre version, et le fichier où le driver doit écrire le résultat
%B la version entrante%P le vrai chemin du fichier fusionné%L la taille des marqueurs de conflit
Sortie 0 et git enregistre le contenu de %A comme une fusion
propre. Sortie non nulle et git y voit un conflit et laisse %A à un
humain. C'est toute l'interface, et c'est pourquoi un driver conscient de Salesforce
peut se réduire à un script qui parse les deux côtés en XML, réunit les nœuds enfants
sous chaque parent, et n'abandonne que lorsque le même élément clé porte des valeurs
différentes de chaque côté.
Deux fichiers, dont un seul est versionné.
D'abord, déclarez le driver dans la config git. Elle vit dans
.git/config, local au clone :
git config merge.sfxml.name "Salesforce metadata XML merge" git config merge.sfxml.driver "sf-xml-merge %O %A %B %P"
Ensuite, dites à git quels fichiers lui reviennent, dans .gitattributes à
la racine du dépôt. Celui-là est commité, donc tous vos coéquipiers l'obtiennent :
force-app/**/*.profile-meta.xml merge=sfxml force-app/**/*.permissionset-meta.xml merge=sfxml force-app/**/*.layout-meta.xml merge=sfxml force-app/**/*.translation-meta.xml merge=sfxml
Commencez étroit. Ajoutez les deux ou trois types de métadonnées qui génèrent le plus de conflits, vivez avec pendant un sprint, puis élargissez les motifs. Un driver qui traite mal, en silence, un type que vous n'avez jamais testé vaut moins que le conflit qu'il remplace.
.gitattributes est versionné, merge.sfxml.driver ne l'est
pas, et git refuse d'exécuter une commande qu'il ne connaît que par un fichier cloné.
Cette séparation est un choix de sécurité délibéré : un dépôt que vous clonez ne peut
pas faire exécuter des commandes arbitraires à votre machine.
Conséquence pratique : un coéquipier qui saute la configuration n'a aucune erreur. Git
retombe silencieusement sur sa fusion textuelle et cette personne voit des marqueurs
de conflit, tandis que tous les autres voient des fusions propres. Réglez cela avec
une étape d'amorçage que personne n'a à retenir : commitez un
scripts/setup-merge-driver.sh qui lance les deux commandes
git config, appelez-le depuis le hook post-install de votre gestionnaire
de paquets, et faites-le échouer bruyamment si le binaire du driver manque.
Trois angles morts à connaître avant de compter dessus :
.git/config. Une pull request qui fusionnerait proprement sur votre
poste peut quand même y signaler des conflits. Le contournement est classique :
fusionnez la branche cible dans votre branche de fonctionnalité en local, là où le
driver tourne, et poussez la résolution.
*.flow-meta.xml hors de vos motifs et résolvez-les dans Flow Builder.
Oui, pour les cas purement additifs. Git embarque un driver union intégré
qui conserve toutes les lignes des deux côtés, et il ne demande aucune entrée de
config :
force-app/**/labels/*.labels-meta.xml merge=union
Il est brutal. La fusion union concatène au lieu de dédupliquer : un nœud ajouté par les deux branches atterrit deux fois et le fichier peut revenir invalide. Réservez-le aux listes plates et purement additives comme les custom labels, et gardez une validation de déploiement en CI pour rattraper ses erreurs. Voyez-le comme une solution d'attente pendant que vous évaluez un vrai driver, pas comme la destination.
Un merge driver est la couche la moins chère et la plus étroite : il supprime les faux conflits au niveau de git, sur les machines des développeurs, et ne fait rien pour la validation ni le déploiement. Les plateformes DevOps intègrent la fusion sémantique dans le pipeline avec un panneau visuel à trois voies, ce qui couvre l'angle mort côté serveur mais lie la résolution à leur outillage.
Serpent prend la troisième voie et résout sur la pull request elle-même. Serpent AI lit le conflit, propose une résolution et attend votre revue avant de l'appliquer, si bien que le correctif atterrit là où la fusion a vraiment lieu plutôt que sur le poste qui se trouve être bien configuré. Voyez Serpent AI, ou parcourez d'autres playbooks Salesforce DevOps evergreen dans les guides Serpent.
Dois-je écrire le merge driver moi-même ?
Pas forcément. Des merge drivers XML Salesforce open source existent, et tout outil de
fusion conscient du XML peut être enveloppé dans un script shell de deux lignes qui
respecte le contrat %O %A %B. Écrire le vôtre reste une après-midi
raisonnable si vos métadonnées ont une forme inhabituelle.
Un merge driver modifie-t-il des fichiers déjà commités ?
Non. Il ne tourne que pendant une fusion, sur le résultat fusionné. L'historique reste intact : vous pouvez en ajouter un puis le retirer sans rien réécrire.
Que se passe-t-il si le driver plante ?
Git traite une sortie non nulle comme un conflit non résolu et laisse les marqueurs en place : un driver cassé retombe donc sur le comportement que vous aviez avant. Faites en sorte que le vôtre sorte en erreur sur tout ce qu'il ne comprend pas, plutôt que de deviner.
Cela remplace-t-il la normalisation des métadonnées au retrieve ?
Non, et les deux se complètent. Normaliser l'ordre des éléments réduit les diffs avant même que git les voie, et le driver traite ce qui survit. Faites les deux si vous le pouvez.
Sans engagement.