Comment configurer git pour ignorer certains fichiers localement?

1351

Puis-je ignorer les fichiers localement sans polluer la configuration globale de git pour tout le monde? J'ai des fichiers non suivis qui sont du spam dans mon état git mais je ne veux pas valider les changements de configuration git pour chaque petit fichier aléatoire non suivi que j'ai dans mes succursales locales.

Bjorn
la source

Réponses:

1864

De la documentation Git pertinente :

Les modèles qui sont spécifiques à un référentiel particulier mais qui n'ont pas besoin d'être partagés avec d'autres référentiels associés (par exemple, des fichiers auxiliaires qui vivent à l'intérieur du référentiel mais qui sont spécifiques au flux de travail d'un utilisateur) doivent aller dans le $GIT_DIR/info/excludefichier.

Le .git/info/excludefichier a le même format que n'importe quel .gitignorefichier. Une autre option consiste à définir core.excludesFilele nom d'un fichier contenant des modèles globaux.

Remarque, si vous avez déjà des modifications non mises en scène, vous devez exécuter ce qui suit après avoir modifié vos modèles ignorés:

git update-index --assume-unchanged <file-list>

Remarque sur$GIT_DIR : Ceci est une notation utilisée partout dans le manuel de git simplement pour indiquer le chemin vers le dépôt git. Si la variable d'environnement est définie, elle remplacera l'emplacement du référentiel dans lequel vous vous trouvez, ce qui n'est probablement pas ce que vous voulez.


Edit : Une autre façon est d'utiliser:

git update-index --skip-worktree <file-list>

Inversez-le en:

git update-index --no-skip-worktree <file-list>
Josh Lee
la source
204
Notez que vous devez exécuter git update-index --assume-unchanged [<file>...]après avoir ajouté le fichier d'exclusion. Les modifications ne seront pas prises en compte jusque-là.
tollmanz
30
Je n'avais pas besoin d'exécuter 'git update-index ...' pour que les changements prennent effet en utilisant git 1.7.9.5.
Jeffrey Martinez
39
Vous n'avez besoin d'utiliser git update-index que si vous avez déjà apporté une modification au fichier et que vous souhaitez maintenant qu'il soit ignoré. Si vous modifiez exclure avant d'effectuer la modification, ce n'est pas nécessaire.
Brady Emerson
13
Bien que cela empêche le fichier d'apparaître comme modifié pendant les validations comme .gitignore, contrairement aux fichiers ignorés, le ou les fichiers seront toujours réinitialisés à la version repo si vous exécutez git reset --hard.
Brady Emerson
19
Par stackoverflow.com/questions/23097368/… et stackoverflow.com/questions/13630849/… , skip-worktreeserait probablement préférable à assume-unchanged.
danShumway
436

Mise à jour : git update-index --skip-worktree [<file>...]pensez à utiliser à la place, merci @danShumway! Voir l'explication de Borealid sur la différence des deux options .


Ancienne réponse:

Si vous devez ignorer les modifications locales apportées aux fichiers suivis (nous l'avons avec les modifications locales apportées aux fichiers de configuration), utilisez git update-index --assume-unchanged [<file>...].

Florian Sesser
la source
8
Juste pour noter, j'ai ajouté un fichier à $ GIT_DIR / info / exclude (par exemple, mon-fichier.php) et j'ai ensuite dû courir git update-index --assume-unchanged my-file.phppour qu'il commence à être ignoré. Merci pour le conseil!
tollmanz
78
Pour l'annuler: git update-index --no-assume-unchanged my-file.php
Ray
18
Juste pour plus de précision: supposons-inchangé est pour les fichiers suivis (existent dans le référentiel) ... OP demandait des fichiers non suivis, auquel cas .git/info/exclude c'est ce que vous voulez (pour éviter de polluer le .gitignore souvent partagé et suivi)
dyodji
7
Selon stackoverflow.com/questions/23097368/…, cela est considéré comme dangereux, et vos fichiers peuvent toujours être validés si vous ne faites pas attention. Il est conçu comme une aide aux performances, pas comme une solution infaillible à ce problème.
danShumway
3
Je me suis précipité --assume-unchangedavant de lire votre mise à jour . J'ai défait --no-assume-unchangedet puis j'ai fait le --skip-worktree... Suis-je en clair?
Nicolas Miari
162

Ajoutez les lignes suivantes à la section [alias] de votre fichier .gitconfig

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Vous pouvez maintenant utiliser git ignore my_filepour ignorer les modifications apportées au fichier local et git unignore my_filepour arrêter d'ignorer les modifications. git ignoredrépertorie les fichiers ignorés.

Cette réponse a été glanée sur http://gitready.com/intermediate/2009/02/18/temporially-ignoring-files.html .

phatmann
la source
1
"! git ls-files -v | grep" ^ [[: lower:]] "- Avez-vous des chances de savoir comment faire cela sur windows cmd?
Haohmaru
3
Installez un vrai shell (par exemple Babun fournit bash ou zsh);) Je connais vos sentiments, mais je suis récemment passé de Windows à Linux et je ne pourrais plus jamais utiliser cmd.
Xerus
@Haohmaru, vous pouvez toujours utiliser WSL (Windows Subsystem for Linux).
Un Sz
110

Vous avez plusieurs options:

  • Laissez un .gitignorefichier sale (ou non engagé) dans votre répertoire de travail (ou appliquez-le automatiquement en utilisant topgit ou un autre outil de correctif de ce type).
  • Mettez les exclus dans votre $GIT_DIR/info/excludefichier, si cela est spécifique à une arborescence.
  • Exécutez git config --global core.excludesfile ~/.gitignoreet ajoutez des modèles à votre ~/.gitignore. Cette option s'applique si vous souhaitez ignorer certains modèles dans tous les arbres. J'utilise ceci pour .pycet les .pyofichiers, par exemple.

Assurez-vous également d'utiliser des modèles et de ne pas énumérer explicitement les fichiers, le cas échéant.

Emil Sit
la source
10
Je pense que vous devez git config --globaldéfinir l'option globalement.
Josh Lee
7
En fait, il suffit d'ajouter .gitignore à .gitignore;)!
Dominik George
68

Je pense que vous cherchez:

git update-index --skip-worktree FILENAME

qui ignorent les modifications apportées localement

Voici http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ plus d'explications sur ces solutions!

pour annuler l'utilisation:

git update-index --no-skip-worktree FILENAME
Piotr Korlaga
la source
9
Il y a une discussion pertinente entre --skip-worktreeet --assume-unchangedà cette question SO
Merwer
1
Comment pourrais-je annuler cela ou voir la liste des fichiers / modèles actuellement ignorés via --skipworktree, devrais-je changer d'avis plus tard et vouloir recommencer le suivi du fichier?
Anomalie
1
comment défaire ça?
user1735921
3
Pour annuler, veuillez utilisergit update-index --no-skip-worktree <file>
user1735921
49

Vous pouvez installer des alias git pour simplifier ce processus. Cela modifie le [alias]nœud de votre .gitconfigfichier.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Les raccourcis que cela installe pour vous sont les suivants:

  • git ignore config.xml
    • git prétendra qu'il ne voit aucun changement config.xml- vous empêchant de commettre accidentellement ces changements.
  • git unignore config.xml
    • git reprendra la reconnaissance de vos modifications config.xml- vous permettant à nouveau de valider ces modifications.
  • git ignored
    • git listera tous les fichiers que vous "ignorez" de la manière décrite ci-dessus.

Je les ai construits en me référant à la réponse de phatmann - qui présente une --assume-unchangedversion de la même chose.

La version que je présente utilise --skip-worktreepour ignorer les modifications locales. Voir la réponse de Borealid pour une explication complète de la différence, mais --skip-worktreel'objectif principal est que les développeurs changent des fichiers sans risquer de valider leurs modifications .

La git ignoredcommande présentée ici utilise git ls-files -vet filtre la liste pour afficher uniquement les entrées commençant par la Sbalise. La Sbalise désigne un fichier dont le statut est "ignorer worktree". Pour une liste complète des états des fichiers affichés par git ls-files: consultez la documentation de l' -toption activée git ls-files.

Bouleaux
la source
1
Cela ne fonctionne pas pour les fichiers non suivis: <(git 2.13.5 sur osx)
Terra Ashley
Est le '!' censé être dedans '!git ls-files -v | grep "^S"'? La commande ne fonctionne pas pour moi avec elle là-bas .. et semble bien fonctionner avec elle supprimée.
Tiris
le point d'exclamation dans un alias git indique à git d'exécuter une commande externe , plutôt qu'une sous-commande git . Je l'ai mis parce que j'ai besoin d'un pipeline shell, donc j'ai besoin d'appeler git de l'extérieur. J'ai juste essayé de supprimer le point d'exclamation (selon votre recommandation), mais cela ne fonctionne pas pour moi. Je comprends Expansion of alias 'ignored' failed; 'git' is not a git command. C'est logique; sans le point d'exclamation: git alias votre commande git git ls-files ….
Birchlabs
Merci pour l'explication. Je ne connais pas l'alias git et je courais juste dans un shell pour tester avant de créer l'alias.
Tiris
Ceci est une solution brillante. Puisque git suit par répertoire, lorsque vous exécutez l'alias ci-dessus git ignore <filename>, il ne s'applique qu'à ce répertoire. Et lorsque vous souhaitez enfin apporter vos modifications à ce fichier et les valider et les envoyer à distance, utilisez simplement le bouton pratique git unignore <filename>pour recommencer temporairement le suivi! Merci!
nickang
42

Vous pouvez simplement ajouter un fichier .gitignore à votre répertoire personnel, c'est $HOME/.gitignore-à- dire ou ~/.gitignore. Dites ensuite à git d'utiliser ce fichier avec la commande:

git config --global core.excludesfile ~/.gitignore

Il s'agit d'un fichier .gitignore normal qui fait référence à ce qui doit être ignoré. Comme il se trouve dans votre répertoire personnel, il ne s'applique qu'à vous et ne pollue aucun fichier .gitignore du projet.

J'utilise cette approche depuis des années avec d'excellents résultats.

JESii
la source
Merci, @EricChen. J'ai mis à jour la réponse; essayez cela, puis utilisez git check-ignore <file-name>pour vérifier. LMK si cela fonctionne pour vous
JESii
Cela ne fonctionnait que pour moi sans =:git config --global core.excludesfile ~/.gitignore
E. Sundin
J'ai mis un .gitignorefichier dans le répertoire personnel et j'ai dit à git d'utiliser ce fichier à la place, puis j'ai supprimé les fichiers que je voudrais décompresser localement. Cependant, après avoir poussé les modifications, le référentiel distant a également supprimé ces fichiers. Est-ce que j'ai fait quelque chose de mal?
zyy
Wow, @xyz; .gitignoreconsiste à ignorer les fichiers qui existent dans votre répertoire local. Ce que vous auriez dû faire est de les git rm --cachedretirer du dépôt mais de les laisser dans votre section locale. Vous devriez pouvoir revenir à votre commit précédent avec quelque chose comme git reset --soft HEAD^annuler ce commit et récupérer vos fichiers. C'est la beauté de Git: tout est toujours là dans votre histoire Git.
JESii
2

Afin d'ignorer les fichiers non suivis, en particulier s'ils se trouvent dans (quelques) dossiers qui ne sont pas suivis, une solution simple consiste à ajouter un .gitignorefichier à chaque dossier non suivi et à entrer dans une seule ligne contenant *suivie d'une nouvelle ligne. C'est une solution vraiment simple et directe si les fichiers non suivis se trouvent dans quelques dossiers. Pour moi, tous les fichiers provenaient d'un seul dossier non suivi vendoret ce qui précède a juste fonctionné.

aak318
la source
1
Génial! FYI: Cela ne fonctionne que parce que git ne fait que suivre (et vous permet de valider) les fichiers, pas les dossiers.
jmiserez
-2

Si votre dépôt n'a pas déjà de fichier .gitignore, alors une solution simple consiste à créer un fichier .gitignore, et à y ajouter .gitignoreà la liste des fichiers à ignorer.

Gavin S. Yancey
la source
4
Et si l'équipe veut ensuite ajouter pour ajouter un gitignore plus tard? Est-ce que cela fonctionne même? Cela ressemble à une idée terrible et à quelque chose qui ne devrait même pas fonctionner.
Bjorn
La réponse de ce mec m'a fait craquer. Personne ne fait ça.
Martyn Chamberlin
Il s'agit d'une solution rapide et simple, tant qu'il y a un endroit où la mettre. Notre .gitignoredépôt a un fichier partagé en haut. Mais mes fichiers sales sont dans un dossier profond, donc j'ai juste ajouté le mien à .gitignorecôté d'eux. +1
joeytwiddle