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 configurer git de sorte qu'il ignore les modifications apportées à ce fichier ultérieurement. .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 qui y sont apportées finiront par être validées et poussées.
Résumer,
- Je voudrais créer un fichier, l'appeler
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 devrait pas ajouterdefault_values.txt
au commit.- Ce comportement doit être transmis à tous les clones du référentiel.
la source
Réponses:
Comme beaucoup d'autres l'ont mentionné, une bonne solution moderne est:
Cela ignorera les modifications apportées à ce fichier, à la fois locales et en amont, jusqu'à ce que vous décidiez de les autoriser à nouveau avec:
Vous pouvez obtenir une liste des fichiers marqués comme ignorés avec:
Notez que contrairement à
--skip-worktree
, le--assume-unchanged
statut sera perdu une fois qu'un changement en amont est tiré.la source
--no-skip-worktree
pour ajouter leurs modifications.--skip-worktree
état d'un fichier avant de pouvoir changer de branche, si ce même fichier est suivi dans l'autre branche.git status
, mais lorsque j'ai essayé de récupérer une branche différente, j'aierror: Your local changes to the following files would be overwritten by checkout:
, même -f n'aide paserror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
git ignore
etgit unignore
.Ce que vous recherchez, c'est
git update-index --assume-unchanged default_values.txt
.Consultez la documentation pour plus de détails: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html
la source
skip-worktree
place deassume-unchanged
plus d'informations stackoverflow.com/questions/13630849/…L'approche que j'ai généralement vue est de créer un fichier avec un nom différent, par exemple: default_values_template.txt et de 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 d'apporter les modifications nécessaires.
la source
.sample
suffixe. Donc dans votre casdefault_values.txt.sample
Jetez un œil aux scripts de smudge / clean. De cette façon, vous pouvez contrôler la version du fichier, mais quand il est extrait, vous le «maculerez» 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 génériques.
Les scripts Smudge / Clean doivent être déterministes en ce sens que les appliquer plusieurs fois, dans des ordres différents, équivaudra à simplement exécuter le dernier de la séquence.
La même chose peut être appliquée avec les mots de passe si vous devez exposer votre référentiel, mais le contenu peut contenir des informations sensibles.
la source
user.json
qui doit être écrasée avec les creds de chaque développeur, mais je ne veux pas que le développeur vérifie accidentellement ses creds.J'ai résolu ce problème en définissant le filtre "propre" pour simplement trouver 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:Définissez cela comme le filtre "propre" pour le fichier concerné (en supposant que vous l'avez mis dans "discard_changes"):
Malheureusement, je ne peux pas trouver un moyen de rendre cela généralisable à 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 brouillon.
la source
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 modèle à git, j'ai ajouté un hook de pré-commit qui vérifie si le fichier modèle a été modifié et si oui, je
git reset -- templatefile.txt
. Si c'est le seul fichier modifié, j'annule également la validation.la source
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.
la source