192 votes

Comment puis-je faire en sorte que git ignore les révisions futures d'un fichier ?

J'ai créé une version par défaut d'un fichier inclus dans un dépôt git. Il est important que lorsque quelqu'un clone le dépôt, il obtienne une copie de ce fichier. Cependant, j'aimerais configurer git de manière à ce qu'il ignore les modifications apportées ultérieurement à ce fichier. .gitignore ne fonctionne que sur les fichiers non suivis.

Ma motivation est que ce fichier contient des informations spécifiques à la machine. J'aimerais fournir des valeurs par défaut, tout en permettant aux gens d'effectuer des changements locaux qui ne seront pas repoussés vers le dépôt d'origine, créant des conflits de fusion lorsque nous tirons de nouveaux changements.

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 de celui-ci finiront par être validées et poussées.

Pour résumer,

  1. Je voudrais créer un fichier, l'appeler default_values.txt qui est ajouté à mon dépôt git et qui est inclus lorsque quelqu'un clone ce dépôt.
  2. git add . ne doit pas ajouter default_values.txt à l'engagement.
  3. Ce comportement doit être transmis à tous les clones du référentiel.

2 votes

Pouvez-vous utiliser les hooks git pour avoir un hook pre-commit qui annulerait un commit si le fichier modifié est default_values.txt (disons) ?

2 votes

Les puristes du Git diraient qu'il ne faut pas être paresseux et utiliser correctement la zone de transit, c'est à cela qu'elle sert.

1 votes

Les puristes de Git diraient d'utiliser smudge/clean scripts. C'est la solution la plus maintenable.

51voto

Yorirou Points 2989

Ce que vous recherchez 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

11 votes

Cela ne fonctionne pas. bien que git add . ignore le fichier sur la branche locale, un clone de l'archive n'a pas ce comportement (si vous modifiez default_values.txt dans l'archive clonée, il sera ajouté au commit avec "git add .")

7 votes

Oui, car vous le définissez uniquement pour le dépôt local. Vous ne pouvez pas pousser ce type d'information.

10 votes

@Indradhanush - cette solution ne satisfait pas le critère 3 -- "le comportement doit être transmis à tous les clones du référentiel" -- c'est pourquoi je ne l'ai pas acceptée. Cela ne veut pas dire que ce n'est pas une bonne réponse.

24voto

Laurence Gonsalves Points 50783

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 gens de copier default_values_template.txt vers default_values.txt dans leurs espaces de travail locaux et de faire les changements nécessaires.

0 votes

Hmmm... peut-être pourrais-je écrire un hook pour copier automatiquement le modèle de valeurs par défaut vers les valeurs par défaut si les valeurs par défaut n'existent pas ?

2 votes

C'est la façon la plus courante de résoudre ce problème selon mon expérience. C'est la voie de la moindre résistance dans la mesure où elle "fonctionne tout simplement", et vous pouvez facilement faire en sorte que votre code vérifie si le fichier de configuration local existe et fournisse une erreur utile si ce n'est pas le cas.

0 votes

Je pense que la solution est effectivement de faire quelque chose comme ça, de préférence avec un script exécuté chaque fois que vous tirez ou clonez. Une idée serait que tout ce qui a une extension particulière (disons .basefile) est copié dans un fichier avec l'extension abandonnée et ensuite le nom du fichier est ajouté à .gitignore dans ce répertoire. Ainsi, je pourrais créer un fichier default_values.txt.basefile et le livrer. Je n'ai pas les compétences git ou perl pour faire ça, mais je vais demander à un ami qui les a et je vous ferai savoir comment ça se passe.

6voto

Adam Dymitruk Points 34999

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

Lorsque vous l'engagez, vous le "nettoyez" en remplaçant les informations spécifiques à la machine par des informations génériques ou de remplacement.

Les Smudge/clean scripts doivent être déterministes en ce sens 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 s'appliquer aux mots de passe si vous devez exposer votre dépôt mais que le contenu peut contenir des informations sensibles.

0 votes

Est-ce que Clean et Smudge scripts sont locaux ou font partie du repo ?

0 votes

Oui. :) ... c'est-à-dire que vous pouvez partager le smudge clean via le repo mais ce n'est pas une bonne idée quand ils contiennent des données sensibles comme les mots de passe de production. Si ce n'est pas un souci, git vous demande d'activer explicitement le script. Sinon, les gens pourraient faire des choses malveillantes via github et d'autres dépôts partagés à d'autres utilisateurs.

0 votes

J'ai besoin de lire un peu plus sur ce sujet. En gros, je veux mettre en place un projet qui a une version par défaut de user.json qui doit être écrasé avec les références de chaque développeur, mais je ne veux pas que le développeur vérifie accidentellement ses références.

3voto

Haddon CD. Points 61

J'ai résolu ce problème en définissant le filtre "clean" pour simplement cat 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é, donc nous pouvons l'utiliser dans un script pour remplacer la copie de travail avec la copie intacte dans l'index :

#! /bin/sh

git show :$1

Définissez-le comme le filtre "propre" pour le fichier concerné (en supposant que vous l'ayez mis 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 à plusieurs fichiers, car il n'y a aucun moyen de dire quel fichier nous traitons à l'intérieur du script propre. Bien sûr, il n'y a rien qui vous empêche d'ajouter une règle de filtrage différente pour chaque fichier, mais c'est un peu maladroit.

0 votes

Presque compréhensible. Pourquoi, si vous avez ajouté le filtre au chemin spécifique dans .gitattributes, auriez-vous besoin de spécifier le fichier sur lequel agir dans la commande "discard changes" ? pourquoi cette commande n'opérerait-elle pas sur n'importe quel fichier que vous avez passé ? par exemple, si dans .gitattributes, vous avez spécifié */ProjectSettings.asset comme le fichier en question avec un filtre appliqué, le filtre devrait être capable d'opérer sur N'IMPORTE QUEL de ces fichiers dans le repo ! Comment faire ?

-2voto

ivanpro Points 19

Je vous suggère de vous intéresser aux submodules. Si vous placez les fichiers spécifiques à la machine dans un submodule, git add devrait l'ignorer.

0 votes

C'est une bonne idée, mais alors je dois aussi mettre le dépôt de fichier unique sur le serveur git, ce qui n'est pas optimal, seulement parce que nous utilisons github et avons un nombre limité de dépôts.

0 votes

@Marc jette un œil à Visual Studio Team Services, aux projets privés gratuits illimités et aux dépôts git. Les tableaux Kanban, le suivi des éléments de travail et des bogues, l'association des checkins aux éléments de travail, la gestion des sprints si vous faites partie de Scrum ou d'autres types de projets. En plus de cela, il a d'excellents outils de construction pour construire sur plusieurs plateformes, trop de choses à mentionner qui sont toutes gratuites. Certaines personnes le critiquent parce qu'il s'agit de Microsoft, mais il surpasse de loin ce que Github a à offrir en termes d'outils, à part l'hébergement de dépôts. Il y a des limites à ce que vous pouvez faire gratuitement, mais je les dépasse rarement.

0 votes

Si j'écris un projet pour un client qui veut posséder le contrôle de la source, je peux créer un compte, l'utiliser pour planifier, concevoir et exécuter le projet et, lorsque j'ai terminé, je peux transférer la propriété du compte au client.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X