Disons que je collabore avec quelqu'un via un référentiel git et qu'il existe un fichier particulier auquel je ne souhaite jamais accepter de modifications externes.
Existe-t-il un moyen pour moi de configurer mon dépôt local pour ne pas me plaindre d'une fusion en conflit à chaque fois que je tire? Je souhaite toujours sélectionner ma version locale lors de la fusion de ce fichier.
echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true
--global
balise. Si vous ne voulez ce comportement que pour un seul repo, laissez de côté l'--global
indicateur:echo 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Réponses:
Sur l'instance spécifique d'un fichier de configuration, je serais d'accord avec la réponse de Ron :
une configuration devrait être "privée" pour votre espace de travail (donc "ignorée", comme dans "déclarée dans un
.gitignore
fichier").Vous pouvez avoir un modèle de fichier de configuration avec des valeurs symbolisées et un script transformant ce
config.template
fichier en un fichier de configuration privé (et ignoré).Cependant, cette remarque spécifique ne répond pas à ce qui est une question plus large, plus générale, à savoir votre question (!):
Ce type de fusion est une «fusion par copie», dans laquelle vous copiez toujours la version «nôtre» ou «la leur» d'un fichier chaque fois qu'il y a un conflit.
Pour "un fichier" (un fichier en général, sans parler d'un fichier "config", car c'est un mauvais exemple), vous y parviendrez avec un script personnalisé appelé par fusion.
Git appellera ce script car vous aurez défini une valeur gitattributes , qui définit un pilote de fusion personnalisé .
Le "pilote de fusion personnalisé" est, dans ce cas, un script très simple qui gardera fondamentalement inchangé la version actuelle, vous permettant ainsi de toujours sélectionner votre version locale.
IE., Comme indiqué par Ciro Santilli :
Testons cela dans un scénario simple, avec un msysgit 1.6.3 sous Windows, dans une simple session DOS:
Maintenant, créons deux fichiers, qui auront tous deux des conflits, mais qui seront fusionnés différemment.
Nous allons introduire un "conflit" dans le contenu de ces deux fichiers dans deux branches git différentes:
Maintenant, essayons de fusionner "hisBranch" sur "myBranch", avec:
dirWithCopyMerge\b.txt
où je veux toujours garder ma versionb.txt
.Puisque la fusion se produit dans «
MyBranch
», nous y retournerons et ajouterons lesgitattributes
directives « » qui personnaliseront le comportement de fusion.Nous avons un
.gitattributes
fichier défini dans ledirWithCopyMerge
répertoire (défini uniquement dans la branche où la fusion aura lieu :)myBranch
, et nous avons un.git\config
fichier qui contient maintenant un pilote de fusion.Si vous ne définissez pas encore keepMine.sh et que vous lancez quand même la fusion, voici ce que vous obtenez.
C'est bon:
a.txt
est prêt à être fusionné et a un conflitb.txt
est toujours inchangé, puisque le pilote de fusion est censé s'en occuper (en raison de la directive dans le.gitattributes
fichier dans son répertoire).Définissez un
keepMine.sh
n'importe où dans votre%PATH%
(ou$PATH
pour notre ami Unix. Je fais les deux bien sûr: j'ai une session Ubuntu dans une session VirtualBox)Comme commenté par lrkwz et décrit dans la section « Stratégies de fusion » de Personnalisation des attributs Git - Git , vous pouvez remplacer le script shell par la commande shell
true
.Mais dans le cas général, vous pouvez définir un fichier script:
keepMine.sh
(qui était un conducteur simple de fusion;) (encore plus simple dans ce cas, l' utilisation
true
)(Si vous voulez garder l'autre version, il suffit d' ajouter avant la
exit 0
ligne:cp -f $3 $2
.Ca y est vous fusionnez pilote serait aways garder la version à venir de l'autre. branche, annulant tout changement local)
Maintenant, réessayons la fusion depuis le début:
La fusion échoue ... uniquement pour a.txt .
Editez a.txt et laissez la ligne de 'hisBranch', puis:
Vérifions que b.txt a été conservé lors de cette fusion
Le dernier commit représente la fusion complète :
(La ligne commençant par Merge le prouve)
Considérez que vous pouvez définir, combiner et / ou écraser le pilote de fusion, comme Git le fera:
<dir>/.gitattributes
(qui est dans le même répertoire que le chemin en question): prévaudra sur l'autre.gitattributes
dans les répertoires.gitattributes
(qui se trouve dans le répertoire parent), ne définira des directives que s'il n'est pas déjà défini$GIT_DIR/info/attributes
. Ce fichier est utilisé pour remplacer les paramètres de l'arborescence. Cela écrasera les<dir>/.gitattributes
directives.Par «combinaison», je veux dire «agréger» plusieurs pilotes de fusion.
Nick Green essaie, dans les commentaires , de combiner réellement les pilotes de fusion: voir " Fusionner les pom via le pilote python git ".
Cependant, comme mentionné dans son autre question , cela ne fonctionne qu'en cas de conflits (modification simultanée dans les deux branches).
la source
cp -f $3 $2
devrait probablement être cité, à savoircp -f "$3" "$2"
.PATH
(Unix ou WindowsPATH
). Puisque ce script sera interprété via le shell bash Unix, ou via le shell Windows MingWin bash MsysGit, il sera portable.Comme @ ciro-santilli l'a commenté, le moyen simple de le faire est de l'utiliser
.gitattributes
avec les paramètres:et activez cette stratégie avec:
(J'ajoute ceci comme réponse pour le rendre plus visible, mais en faisant un wiki communautaire pour ne pas essayer d'obtenir au-dessus des crédits de l'utilisateur pour moi-même. Veuillez voter pour son commentaire sous le Q ici pour lui donner des félicitations!)
la source
:-)
).Nous avons plusieurs fichiers de configuration que nous ne voulons jamais écraser. Cependant .gitignore et .gitattributes ne fonctionnaient pas dans notre situation. Notre solution était de stocker les fichiers de configuration dans une branche de configuration. Ensuite, autorisez les fichiers à changer pendant la fusion git, mais immédiatement après la fusion, utilisez la "branche git checkout -". pour copier nos fichiers de configuration de la branche configs après chaque fusion. Réponse détaillée de stackoverflow ici
la source