172 votes

Git - Ignorer les fichiers pendant la fusion

J'ai un dépôt appelé myrepo sur la télécommande beanstalk serveur.

Je l'ai cloné sur ma machine locale. J'ai créé deux branches supplémentaires : staging y dev . J'ai poussé ces branches à distance aussi.

Maintenant :

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

J'ai un fichier appelé config.xml qui est différent sur chaque branche.

Je veux ignorer ce fichier uniquement pendant les fusions. Mais je veux qu'il soit inclus lorsque je fais un checkout ou un commit depuis/vers la branche repo.

La raison pour laquelle je veux cela est que nous avons un script de déploiement qui tire (checkout) la branche spécifique et déploie sur les serveurs respectifs. Nous avons donc besoin de config.xml de cette branche spécifique va dans le serveur spécifique comme indiqué ci-dessus lors du déploiement.

Je suppose .gitignore ne fonctionne pas. Quelles sont les autres options ? Notez que le fichier ignoré devrait faire partie de checkout et commit, ce qui est important. Il ne devrait être ignoré que pendant les fusions.

Merci !

153voto

unmesh-gurjar Points 1449

J'ai surmonté ce problème en utilisant la commande git merge avec l'option --no-commit puis supprime explicitement le fichier mis à disposition et ignore les modifications apportées au fichier. Ex : disons que je veux ignorer toutes les modifications apportées à myfile.txt Je procède comme suit :

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Vous pouvez placer les déclarations 2 et 3 dans une boucle for, si vous avez une liste de fichiers à ignorer.

64voto

Kevin Rave Points 1618

J'ai fini par trouver git attributes . Essayez-le. Cela fonctionne jusqu'à présent. Je n'ai pas encore vérifié tous les scénarios. Mais cela devrait être la solution.

Stratégies de fusion - Attributs Git

28voto

eigenharsha Points 907

.gitattributes - est un fichier de niveau racine de votre référentiel qui définit les attributs d'un sous-répertoire ou d'un sous-ensemble de fichiers.

Vous pouvez spécifier l'attribut pour indiquer à Git d'utiliser différentes stratégies de fusion pour un fichier spécifique. Ici, nous voulons préserver la stratégie de fusion existante config.xml pour notre branche. Nous devons définir le merge=foo a config.xml en .gitattributes fichier.

merge=foo indique à git d'utiliser notre fichier (branche courante), si un conflit de fusion se produit.

  1. Ajouter un .gitattributes au niveau racine du référentiel.

  2. Vous pouvez configurer un attribut pour confix.xml dans le fichier .gitattributes archivo

     <pattern> merge=foo

    Prenons un exemple pour config.xml

     config.xml merge=foo
  3. Et ensuite définir un mannequin foo fusionner la stratégie avec :

     $ git config --global merge.foo.driver true

Si vous fusionnez le stag formulaire dev au lieu d'avoir des conflits de fusion avec la branche config.xml le fichier config.xml de la branche stag est conservé à la version que vous aviez à l'origine.

pour plus de référence : fusionner_stratégies

9voto

gcbenison Points 4253

Vous pouvez commencer par utiliser git merge --no-commit puis modifiez la fusion comme vous le souhaitez, par exemple en déstockant. config.xml ou tout autre fichier, puis valider. Je pense que vous voudrez automatiser davantage après cela en utilisant des hooks, mais je pense que cela vaut la peine de le faire manuellement au moins une fois.

9voto

Sole Sensei Points 252

Exemple :

  1. Vous avez deux branches : master , develop
  2. Vous avez créé un fichier dans develop et que vous voulez l'ignorer lors de la fusion

Código:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

Vous pouvez également ignorer les fichiers ayant la même extension

par exemple, tous les fichiers avec .txt extension :

echo "*.txt merge=ours" >> .gitattributes

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