86 votes

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

Nous maintenons application web qui a du bon la branche principale, et de nombreuses branches parallèles, un pour chaque installation, chaque avoir quelques changements spécifiques. Le code Source est géré dans git et il est formidable outil lorsque nous avons besoin de transfert de fonctionnalités et corrections de branche master en parallèle. Mais rares sont les fichiers qui sont sensibles et automatique de la fusion de l'habitude de donner de mauvais résultats. Donc, la fusion serait beaucoup plus facile si elles peuvent être en quelque sorte marqué et chaque fusion entraînerait des conflits nécessitant une fusion manuelle.

J'ai cherché une réponse :

  1. Je suis à l'aide de l'option--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. Cas similaire semble être la façon de prévenir de fichiers fusionnés à l'aide .gitattributes contenant: somefile.php fusion=nôtre . J'ai essayé de trouver certains de fusion option qui permettrait de générer des conflits ou de force manuel de fusion, mais aucune n'a été trouvée jusqu'à présent.
  4. .gitattributes contenant: somefile.php -fusion n'est jamais fusionnées automatiquement et donc de forçage manuel de fusion. Il est de 90% de la solution, mais ce que je cherche, c'est d'essayer automatique de la fusion et de la marquer comme conflit, peu importe c'est réussi ou pas. Mais c'est de loin le plus proche de la solution. (...grâce Charles Bailey pour des précisions...)
  5. Quelqu'un suggère d'écrire une fusion personnalisée conducteur (1, 2), mais la façon de faire est loin d'être claires pour moi.

edit: variante 4. description

65voto

Dan Moulding Points 46866

L'Option 5, une coutume de fusion pilote, est probablement la façon d'obtenir le plus proche 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éer une fusion pilote script appelé merge-and-verify-driver. Le rendre exécutable et de le mettre dans un endroit approprié (vous pouvez envisager de vérification de ce script dans le repo, même, depuis le repo de fichier de configuration va dépendre de l'). Git va exécuter ce script shell pour exécuter la fusion des fichiers sensibles:

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

Cela n'a tout simplement la fusion par défaut le comportement que Git se fait normalement. La principale différence est que le script renvoie toujours non nulle (à indiquer qu'il y a un conflit, même si la fusion a été effectivement résolu sans conflits).

Ensuite, vous devez indiquer à Git au sujet de l'existence de votre coutume de fusion pilote. Pour ce faire, dans le repo de fichier de configuration (.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 les pensions de titres du répertoire de niveau supérieur (./). Vous aurez besoin de spécifier le chemin vers le script en conséquence.

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

*.sensitive merge=verify

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

1voto

VonC Points 414372

Remarque: cet article "l'Écriture d'un git merge pilote pour les fichiers PO" illustre le type de manipulation que vous pouvez le faire manuellement la fusion d'un fichier: vous pouvez pré-traitées dans l'ordre de votre manuel de fusion et d'avoir certaines données prêt.

git merge-file peut être utilisé, par exemple, à DÉCHIFFRER (et re-chiffrer) des fichiers avant de les fusionner (!)

Dans votre cas, la sortie de la fusion de pilote avec un non-0 état de s'assurer que la fusion sera un manuel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X