web-dev-qa-db-fra.com

Comment puis-je faire git ignorer les futures révisions d'un fichier?

J'ai créé une version par défaut d'un fichier inclus dans un référentiel git. Il est important que lorsque quelqu'un clone le référentiel, il obtienne une copie de ce fichier. Cependant, je voudrais définir git pour qu'il ignore les modifications apportées à ce fichier plus tard. .gitignore ne fonctionne que sur les fichiers non suivis.

Ma motivation est que ce fichier contient des informations spécifiques à la machine. Je voudrais fournir des valeurs par défaut, tout en permettant aux gens d'apporter des modifications locales qui ne seront pas repoussées vers le référentiel d'origine, créant des conflits de fusion lorsque nous tirons de nouvelles modifications.

Nous sommes généralement assez paresseux et utilisons git add . beaucoup, donc je suis sûr que si je ne peux pas dire à git d'ignorer ce fichier, les modifications finiront par être validées et poussées.

Résumer,

  1. Je voudrais créer un fichier, appelez-le default_values.txt qui est ajouté à mon référentiel git et est inclus lorsque quelqu'un clone ce référentiel.
  2. git add . ne doit pas ajouter default_values.txt au commit.
  3. Ce comportement doit être transmis à tous les clones du référentiel.
99
Marc

Ce que vous recherchez est git update-index --assume-unchanged default_values.txt.

Voir les documents pour plus de détails: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html

47
tamasd

L'approche que j'ai généralement vue consiste à créer un fichier avec un nom différent, par exemple: default_values_template.txt et à mettre default_values.txt dans votre .gitignore. Demandez aux utilisateurs de copier default_values_template.txt dans default_values.txt dans leurs espaces de travail locaux et apportez les modifications nécessaires.

19
Laurence Gonsalves

Jetez un oeil à smudge/clean scripting. De cette façon, vous pouvez contrôler la version du fichier, mais lorsqu'il est extrait, vous le "tachez" en remplaçant les données génériques/d'espace réservé par des données spécifiques à la machine dans le fichier.

Lorsque vous le validez, vous le "nettoyez" en remplaçant les informations spécifiques à la machine par des informations génériques ou d'espace réservé.

Les scripts Smudge/Clean doivent être déterministes en ce que les appliquer plusieurs fois, dans des ordres différents sera l'équivalent de simplement exécuter le dernier de la séquence.

La même chose peut être appliquée avec des mots de passe si vous devez exposer votre référentiel mais le contenu peut contenir des informations sensibles.

5
Adam Dymitruk

J'ai résolu cela en définissant le filtre "propre" pour simplement chat le contenu du fichier dans l'index.

git show :path/to/myfile devrait simplement imprimer le contenu de l'index pour le fichier spécifié, afin que nous puissions l'utiliser dans un script pour remplacer la copie de travail par la copie intacte dans l'index:

#! /bin/sh

git show :$1

Définissez-le comme filtre "propre" pour le fichier concerné (en supposant que vous l'ayez placé dans "discard_changes"):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

Malheureusement, je ne trouve pas de moyen de rendre cela généralisable en plusieurs fichiers, car il n'y a aucun moyen de savoir quel fichier nous traitons à partir du script propre. Bien sûr, rien ne vous empêche d'ajouter une règle de filtrage différente pour chaque fichier, mais c'est un peu lourd.

3
Haddon CD.

J'ai trouvé une solution qui fonctionne pour mon équipe. Nous partageons nos githooks via des liens symboliques et après avoir ajouté un fichier de modèle à git, j'ai ajouté un crochet de pré-validation qui vérifie si le fichier de modèle a été modifié et si oui, je git reset -- templatefile.txt. S'il s'agit du seul fichier modifié, j'annule également la validation.

1
fruitcoder

Je suggère d'examiner les sous-modules. Si vous placez les fichiers spécifiques à la machine dans un sous-module, git add devrait l'ignorer.

0
ivanpro