Git - comment forcer la fusion de conflit et la fusion manuelle sur le fichier sélectionné

nous maintenons l'application web qui a la branche principale commune et de nombreuses branches parallèles, une pour chaque installation, chacun ont peu de changements spécifiques. Le code Source est géré en git et c'est un outil formidable lorsque nous avons besoin de fonctions de transfert et de corrections de bugs depuis la branche principale vers des branches parallèles. Mais il y a peu de fichiers qui sont sensibles et la fusion automatique donne habituellement de mauvais résultats. Ainsi, la fusion serait beaucoup plus facile si elle pouvait être marquée d'une façon ou d'une autre et chaque Fusion entraînerait un conflit nécessitant manuel de fusion.

j'ai cherché une réponse :

  1. je suis à l'aide de --no-commit et --no-ff options de fusion, mais il n'est pas le même.
  2. Ici et ici quelqu'un pose la même question, mais avec pas de solution.
  3. affaire similaire semble être comment empêcher la fusion de fichier utiliser. gitattributes contenant: unfichier.php de fusion=nôtre . J'ai essayé de trouver une option de fusion qui générerait un conflit ou une fusion manuelle des forces mais je n'en ai trouvé aucune jusqu'à présent.
  4. .gitattributes contenant: unfichier.php-merge n'est jamais fusionné automatiquement et donc forcer la fusion manuelle. C'est une solution à 90%, mais ce que je cherche, c'est d'essayer la fusion automatique et de la marquer comme conflit, qu'elle soit réussie ou non. But c'est de loin le plus proche de la solution. (...merci Charles Bailey pour la clarification...)
  5. Quelqu'un suggère d'écrire le pilote de fusion personnalisé( 1 , 2 ), mais comment le faire est loin d'être clair pour moi.

modifier: variante 4. description

71
demandé sur Community 2011-02-22 08:39:58

3 réponses

L'Option 5, un pilote de fusion personnalisé, est probablement le moyen de se rapprocher le plus possible de ce que vous voulez. Il est étonnamment facile à faire. Ci-dessous est un exemple de quelqu'un qui je pense, devrait vous obtenir assez proche du comportement que vous désirez.

tout d'abord, créez un script de pilote de fusion appelé merge-and-verify-driver . Faites-le exécutable et mettez-le dans un endroit approprié (vous pouvez envisager de vérifier ce script dans le fichier repo, même, puisque le fichier de configuration du repo va en dépendre). Git is va exécuter ce script shell pour exécuter la fusion des fichiers sensibles:

#!/bin/bash
git merge-file "" "" ""
exit 1

cela ne fait que le comportement de fusion par défaut que Git lui-même fait normalement. La différence principale est que le script renvoie toujours non-zero (pour indiquer qu'il y a eu un conflit, même si la fusion a été effectivement résolue sans conflits).

ensuite, vous devez parler à Git de l'existence de votre pilote de fusion personnalisé. Vous faites cela dans la config de la repo fichier ( .git/config ):

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

dans cet exemple, j'ai mis merge-and-verify-driver dans le répertoire de haut niveau de repo ( ./ ). Vous devrez spécifier le chemin d'accès au script en conséquence.

Maintenant, vous avez juste besoin de donner aux fichiers sensibles les attributs appropriés pour que le pilote de fusion personnalisé soit utilisé lors de la fusion de ces fichiers. Ajoutez ceci à votre fichier .gitattributes :

*.sensitive merge=verify

ici, j'ai dit à Git que n'importe quel dossier avec un nom correspondant au modèle *.sensitive doit utiliser le pilote de fusion personnalisé. Évidemment, vous devez utiliser le modèle approprié à votre fichier(s).

53
répondu Dan Moulding 2011-02-23 13:50:31

Note: Cet article " Écrire un pilote de fusion git pour les fichiers PO " illustre le type de manipulation que vous pouvez faire lors de la fusion manuelle d'un fichier: vous pouvez le pré-traité afin que votre fusion manuelle pour avoir certaines données prêtes.

git merge-file peut être utilisé, par exemple, pour déchiffrer (et re-chiffrer) les fichiers avant la fusion (!)

dans votre cas, sortie de votre Fusion pilote avec un statut non-0 s'assurer que la fusion sera manuelle.

1
répondu VonC 2012-11-16 12:10:18

ces deux commandes semblent avoir le même effet que l'utilisation du pilote de fusion personnalisé:

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

la première commande arrête la fusion avant la création de la commit de fusion, et la seconde marque Tous les fichiers modifiés dans les deux branches comme un conflit à résoudre même s'il n'y avait pas de conflit à l'origine.

0
répondu louisiuol 2018-08-14 09:13:52