web-dev-qa-db-fra.com

Git - Ignorer les fichiers lors de la fusion

J'ai un référant appelé myrepo sur le serveur beanstalk distant.

Je l'ai cloné sur ma machine locale. Création de deux branches supplémentaires: staging et dev. Ces branches ont également été déplacées.

À présent: 

 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 que cela soit inclus lorsque je passe à la caisse ou que je valide depuis/vers la branche repo.

La raison pour laquelle je le souhaite est que nous avons un script de déploiement qui extrait (extrait) la branche spécifique et le déploie sur les serveurs respectifs. Il faut donc que le fichier config.xml de cette branche spécifique soit connecté au serveur spécifique, comme indiqué ci-dessus lors du déploiement.

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

Merci!

72
Kevin Rave

J'ai fini par trouver git attributes. L'essayer Travailler jusqu'à présent. N'a pas encore vérifié tous les scénarios. Mais cela devrait être la solution.

Stratégies de fusion - Attributs Git

35
Kevin Rave

J'ai surmonté ce problème en utilisant la commande git merge avec l'option --no-commit, puis j'ai explicitement retiré le fichier intermédiaire et ignoré les modifications apportées au fichier . E.g .: dis 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 mettre les déclarations 2 et 3 dans une boucle for, si vous avez une liste de fichiers à ignorer.

62
unmesh-gurjar

.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 conserver le config.xml existant pour notre branche. Nous devons définir le merge=ours sur config.xml dans le fichier .gitattributes.

merge=ours indique à git d'utiliser notre fichier (branche actuelle) en cas de conflit de fusion.

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

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

    config.xml merge=ours
    
  3. Et ensuite définir une stratégie de fusion factice avec:

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

Si vous fusionnez la branche stag de la branche dev, au lieu d'avoir des conflits de fusion avec le fichier config.xml, conservez le fichier config.xml de la branche stag, quelle que soit votre version d'origine.

10
eigenharsha

Vous pouvez commencer par utiliser git merge --no-commit, puis éditer la fusion comme bon vous semble, en décompressant config.xml ou tout autre fichier, puis valider. Je suppose que vous voudriez l’automatiser davantage après l’utilisation de crochets, mais je pense que cela vaudrait la peine d’être traité manuellement au moins une fois.

5
gcbenison

Vous pouvez utiliser .gitignore pour conserver le config.xml en dehors du référentiel, puis utiliser un post commit hook pour télécharger le fichier config.xml approprié sur le serveur.

3
tlehman

Ici git-update-index - Enregistrez le contenu du fichier dans 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

1
Sireesh Yarlagadda

Exemple:

  1. Vous avez deux branches: master, develop
  2. Vous avez créé le fichier dans la branche develop et souhaitez l'ignorer lors de la fusion

Code (en racine de yout git):

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 l'extension .txt:

echo "*.txt merge=ours" >> .gitattributes
0
Sole Sensei