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,
default_values.txt
qui est ajouté à mon référentiel git et est inclus lorsque quelqu'un clone ce référentiel.git add .
ne doit pas ajouter default_values.txt
au commit.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
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.
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.
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.
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.
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.