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, consultez cette question ):
git update-index --no-assume-unchanged [<file> ...]
Documentation pertinente :
- [no-] assume-unchanged
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 "supposé inchangé" pour les chemins. Lorsque le bit "supposer inchangé" est activé, l'utilisateur promet de 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ésactiver le bit pour le dire à Git. Cela est parfois utile lorsque vous travaillez avec un gros projet sur un système de fichiers qui a un lstat(2)
appel système très lent (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.
Échouer gracieusement dans ce cas signifie que s'il y a des modifications en amont de ce fichier (modifications légitimes, etc.) lorsque vous effectuez un pull, il dira:
$ 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 surmonter cela en annulant vos modifications locales, voici une façon:
$ git checkout filename.ext
puis tirez à nouveau et modifiez à nouveau votre fichier local, ou pourrait définir –no-assume-unchanged
et vous pouvez faire stash et fusion normale, etc. à ce moment-là.