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 !

5voto

Tobi Lehman Points 1441

Vous pourriez utiliser .gitignore pour garder le config.xml hors du référentiel, et ensuite utiliser une crochet post-commission pour télécharger les config.xml sur le serveur.

5voto

MattSchmatt Points 528

Comme l'ont fait remarquer de nombreuses personnes, il convient de noter que la réponse acceptée et les copies de celui-ci (en utilisant une stratégie de fusion personnalisée pour un ou plusieurs fichiers spécifiques) ne fonctionne que dans les cas où il y aurait des conflits de fusion réels. .

2 cas simples qui n'entraîneraient pas de conflits de fusion et donc de commits fusionnés :

  • Vous avez un config.xml dans une branche de fonctionnalité et non dans le master. Vous voulez l'exclure pendant la fusion
  • Votre config.xml dans les deux branches sont basées sur le même commit. Du nouveau code est ajouté au fichier dans la branche.

Soit utiliser merge --no-commit comme le démontre unmesh-gurjar ou simplement choisir des commits inviduels dans master. Cette dernière solution est bien sûr assez lourde et s'accompagne de quelques autres écueils (nouveaux ID SHA1, etc.).

3voto

Sireesh Points 802

Ici git-update-index - Enregistre le contenu des fichiers de l'arbre de travail dans l'index.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

Exemple:-

git update-index --assume-unchanged somelocation/pom.xml

1voto

Pieter Points 596

Envisagez l'utilisation de git hooks :

Après avoir exécuté un checkout git réussi, le hook post-checkout s'exécute ; vous pouvez l'utiliser pour configurer votre répertoire de travail correctement pour l'environnement de votre projet. Cela peut signifier déplacer de gros fichiers binaires dont vous ne voulez pas contrôler les sources, générer automatiquement de la documentation, ou quelque chose de ce genre.

Source : https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#:~:text=Après%20que%20tu%20courses, le long%20de%20ces%20lignes .

Vous pouvez placer ces fichiers dans un répertoire séparé qui, si nécessaire, peut être choisi pour être exclu du référentiel par le biais de .gitignore .

Sur la base du nom de la branche vers laquelle on bascule, le script de l'application post-checkout hook peut alors prendre les bons fichiers (qui peuvent être dans des sous-répertoires) pour cette branche et les copier (en les écrasant) aux bons emplacements. Ces fichiers individuels spécifiques à une branche doivent être dans des sous-répertoires de .gitignore .

Exemple de post-checkout script en .git/hooks :

#!/bin/sh

BRANCH=`git reflog | awk 'NR==1{ print $8; exit }'`

cp "./configs/$BRANCH/config.json" "./config.json"

exit 0

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