web-dev-qa-db-fra.com

Puis-je "git" valider un fichier et ignorer ses modifications de contenu?

Chaque développeur de mon équipe a sa propre configuration locale. Ces informations de configuration sont stockées dans un fichier appelé devtargets.rb qui est utilisé dans nos tâches de génération de rake. Cependant, je ne veux pas que les développeurs s'empilent mutuellement le fichier devtargets.

Ma première pensée a été de mettre ce fichier dans la liste .gitignore afin qu'il ne soit pas affecté à git.

Puis j'ai commencé à me demander: est-il possible de valider le fichier, mais d'ignorer les modifications apportées au fichier? Donc, je validerais une version par défaut du fichier, puis lorsqu'un développeur le modifierait sur sa machine locale, git ignorerait les modifications et il n'apparaîtrait pas dans la liste des fichiers modifiés lorsque vous effectuez un statut git ou git commit. .

Est-ce possible? Ce serait certainement une belle fonctionnalité ...

312
Derick Bailey

Bien sûr, je fais exactement cela de temps en temps en utilisant

git update-index --assume-unchanged [<file> ...]

Pour annuler et recommencer le suivi (si vous avez oublié quels fichiers n'ont pas été suivis, voir cette question ):

git update-index --no-assume-unchanged [<file> ...]

documentation pertinente :

- [no-] suppose-inchangé
Lorsque cet indicateur est spécifié, les noms d'objet enregistrés pour les chemins ne sont pas mis à jour. Au lieu de cela, cette option active/désactive le bit "suppose inchangé" pour les chemins. Lorsque le bit "assumer inchangé" est activé, l'utilisateur s'engage à ne pas modifier le fichier et permet à Git de supposer que le fichier d'arbre de travail correspond à ce qui est enregistré dans l'index. Si vous souhaitez modifier le fichier d'arbre de travail, vous devez désélectionner le bit pour en informer Git. Ceci est parfois utile lorsque vous travaillez avec un grand projet sur un système de fichiers qui a un appel système très lent lstat(2) (par exemple, cifs).

Git échouera (gracieusement) au cas où il aurait besoin de modifier ce fichier dans l'index, par exemple. lors de la fusion dans un commit; ainsi, si le fichier supposé non suivi est modifié en amont, vous devrez gérer la situation manuellement.

Échec dans ce cas signifie, s'il y a des modifications en amont de ce fichier (modifications légitimes, etc.) que vous effectuez une extraction, elle indiquera:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> Origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

et refusera de fusionner.

À ce stade, vous pouvez résoudre ce problème en inversant vos modifications locales, en voici un exemple:

 $ git checkout filename.ext

puis tirez à nouveau et modifiez à nouveau votre fichier local, ou vous pouvez définir –no-assume-unchanged et vous pouvez effectuer une fusion et une fusion normales, etc. à ce stade.

409
Rob Wilkerson

La méthode préférée consiste à utiliser git update-index --skip-worktree <file>, comme expliqué dans cette réponse :

assume-unchanged est conçu pour les cas où il est coûteux de vérifier si un groupe de fichiers a été modifié; Lorsque vous définissez le bit, git (bien sûr) suppose que les fichiers correspondant à cette partie de l'index n'ont pas été modifiés dans la copie de travail. Donc, cela évite un gâchis d'appels statistiques. Ce bit est perdu chaque fois que l'entrée du fichier dans l'index change (donc, lorsque le fichier est modifié en amont).

skip-worktree est plus que cela: même si git sait que le fichier a été modifié (ou doit être modifié à l'aide d'un reset - hard ou similaire), il prétendra que ce n'est pas le cas, en utilisant la version précédente. index à la place. Cela persiste jusqu'à ce que l'index soit supprimé.

Pour annuler cela, utilisez git update-index --no-skip-worktree <file>

77
1615903

La pratique courante semble être de créer un devtargets.default.rb et de le commettre, puis de demander à chaque utilisateur de copier ce fichier dans devtargets.rb (figurant dans la liste .gitignore). Par exemple, CakePHP fait la même chose pour son fichier de configuration de base de données qui change naturellement d'une machine à l'autre.

37
erjiang

Pour les utilisateurs d'IntelliJ IDEA: Si vous souhaitez ignorer les modifications apportées à un ou plusieurs fichiers, vous pouvez le déplacer vers un autre Change Set.

  • Rendez-vous sur Local Changes (Cmd + 9)
  • Sélectionnez le (s) fichier (s) que vous souhaitez ignorer
  • F6 pour les déplacer dans un autre Change Set
0
Eugene