Comment puis-je faire git ne pas tenir compte des révisions futures dans un fichier?

StackOverflow https://stackoverflow.com/questions/4348590

  •  30-09-2019
  •  | 
  •  

Question

J'ai créé une version par défaut d'un fichier inclus dans un dépôt git. Il est important que quand quelqu'un clones le dépôt, ils obtiennent une copie de ce fichier. Cependant, je voudrais git ensemble afin qu'il ne tient pas compte des modifications à 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 de faire des changements locaux qui ne sera pas poussé dans le référentiel d'origine, ce qui crée des conflits de fusion lorsque nous nous retirons de nouveaux changements.

Nous sommes généralement assez git add . paresseux et utiliser beaucoup, donc je suis sûr que si je ne peux pas dire git d'ignorer ce fichier, les modifications qui y finira par s'engagés et poussé.

En résumé,

  1. Je voudrais créer un fichier, appelez-default_values.txt qui est ajouté à mon dépôt git et est inclus lorsque les clones de quelqu'un qui dépôt.
  2. git add . ne doit pas ajouter au default_values.txt commettras.
  3. Ce comportement doit être transmis à tous les clones du référentiel.
Était-ce utile?

La solution

Comme beaucoup d'autres l'ont mentionné, une bonne solution moderne est:

git update-index --skip-worktree default_values.txt

Cela ne tient pas compte des modifications à ce fichier, à la fois local et en amont, jusqu'à ce que vous décidez de leur permettre de nouveau avec:

git update-index --no-skip-worktree default_values.txt

Vous pouvez obtenir une liste des fichiers qui sont marqués avec sautée:

git ls-files -v . | grep ^S

Notez que contrairement --skip-worktree, l'état---assume inchangé va se perdre une fois un changement en amont est tiré.

Autres conseils

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

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

L'approche que je l'ai vu en général est de créer un fichier avec un nom différent, par exemple: default_values_template.txt et mettre default_values.txt dans votre .gitignore. Instruire les gens à copier default_values_template.txt à default_values.txt dans leurs espaces de travail locaux et apporter les changements nécessaires.

Jetez un oeil à maculage / script propre. De cette façon, vous pouvez contrôler la version du fichier, mais quand il est extrait, vous allez « bavure » en remplaçant les données / générique lieu-porte avec des données spécifiques de la machine dans le fichier.

Lorsque vous vous engagez, vous sera « propre » en remplaçant les informations spécifiques de la machine avec des informations génériques ou porte-lieu.

Smudge / scripts propres doit être déterministe qui les appliquer à plusieurs reprises, dans des ordres différents seront l'équivalent de seulement courir le dernier dans la séquence.

La même chose peut être appliqué avec des mots de passe si vous avez besoin d'exposer votre dépôt, mais le contenu peut contenir des informations sensibles.

J'ai résolu ce problème en définissant le filtre « propre » chat simplement le contenu du fichier dans l'index.

git show :path/to/myfile devrait juste 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 avec la copie intacte dans l'index:

#! /bin/sh

git show :$1

Définir que le filtre « propre » pour le fichier concerné (en supposant que vous avez mis que « discard_changes »):

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

Malheureusement, je ne peux pas trouver un moyen de rendre ce généralisable à plusieurs fichiers, car il n'y a aucun moyen de dire quel fichier que nous traitiez à l'intérieur du script propre. Bien sûr, il n'y a rien pour vous empêcher d'ajouter une règle de filtrage différent pour chaque fichier, mais il est un peu cludgy.

J'ai trouvé une solution qui fonctionne pour mon équipe. Nous partageons nos githooks via des liens symboliques et après l'ajout d'un fichier de modèle à git j'ai ajouté un pre-commit crochet 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 changé aussi je abort la livraison.

Je suggère à la recherche en sous-modules. Si vous placez les fichiers spécifiques de la machine dans un sous-module, ajouter git doit l'ignorer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top