git ignorer les fichiers temporaires vim

238

Quelle est la bonne façon de faire ignorer à git les fichiers temporaires produits par vim dans tous les répertoires (globalement sur le système ou localement pour un seul projet)?

jrdioko
la source
6
Le modèle *.sw?résout le standard .swpmais aussi les extensions de fichier d'échange alternatives comme .swo.
buley le
7
@buley, votre suggestion ignorera également les .swffichiers. Je déconseille fortement de le faire, surtout si vous créez une application Flash.
stephenmurdoch
1
@marflar Bon point. Le même modèle préfixé avec le fichier caché .devrait empêcher cela cependant.
buley
J'ai aussi vu un .swx aujourd'hui.
Richard
2
L' expérience montre que après la création de 16 fichiers de sauvegarde ( .tmp.swp, .tmp.swo, ..., .tmp.swa), vim crée .tmp.svz. Je manque de patience pour voir ce qui vient après .tmp.saa- peut-être .tmp.rzz? MISE À JOUR: En regardant dans la source ( src/memline.c, fonction findswapname()), il abandonne après .saaavec une erreur: "E326: Trop de fichiers d'échange trouvés".
Keith Thompson

Réponses:

392

Les fichiers temporaires Vim se terminent par ~ afin que vous puissiez ajouter au fichier .gitignorela ligne

*~

Vim crée également des fichiers d'échange qui ont les extensions swp et swo. pour les supprimer, utilisez les lignes:

*.swp
*.swo

Cela ignorera tous les fichiers temporaires vim dans un seul projet

Si vous voulez le faire globalement, vous pouvez créer un fichier .gitignore dans votre maison (vous pouvez lui donner un autre nom ou emplacement) et utiliser la commande suivante:

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

Ensuite, il vous suffit d'ajouter les fichiers que vous souhaitez ignorer à ce fichier

nunopolonia
la source
30
Vim créera des fichiers d'échange nommés successivement (.swp, .swo, etc.), donc je les utilise .*.sw*dans my .gitignorepour les masquer tous.
Drew Stephens
32
@DrewStephens, je pense .*.sw?être plus précis. (Bien que j'aie vu des gens utiliser une variante de *.sw*pour soupçonner que je suis celui qui manque quelque chose de vraiment évident ...)
Morten Siebuhr
10
@Morten Selon vimdoc.sourceforge.net/htmldoc/recover.html,. *. S ?? les attraperait tous sur Unix (les diminutions .s ?? de .swp à .saa).
Max Nanasy
6
Juste pour développer un excellent commentaire sur @MatrixFrog, car cette question s'adresse à vim, vous pouvez trouver le bon .gitignore dans ce projet ici .
SnapShot
17
Faites attention. github .*.s[a-w][a-z]ignorera les .svgfichiers.
Jon
118

Vous pouvez également configurer vim pour enregistrer les fichiers d'échange dans un emplacement séparé, par exemple en ajoutant des lignes similaires à ce qui suit dans votre .vimrcfichier:

set backupdir=$TEMP//
set directory=$TEMP//

Voir cette astuce vim pour plus d'informations.

martinl
la source
8
note, dans Mac OS X, vous pouvez utiliser $TMPDIRpour obtenir le tempdir réel :)
Alex Moore-Niemi
5
La double barre oblique après votre répertoire préféré (j'utilise ~ / tmp //) empêche les collisions de noms de fichiers en stockant le chemin complet. De cette façon, vous pouvez toujours modifier des fichiers nommés, par exemple, config.xml dans deux répertoires en même temps.
Brian
1
Que veut $TEMPdire?
themefield
Remarque J'ai également dû ajouter set undodir=$TEMP//, car j'enregistre également des fichiers d'annulation persistants.
Micah Lindstrom
24

C'est quelque chose qui ne devrait être fait que par utilisateur, et non par référentiel. Si Joe utilise emacs, il voudra ignorer les fichiers de sauvegarde emacs, mais Betty (qui utilise vi) voudra que les fichiers de sauvegarde vi soient ignorés (dans de nombreux cas, ils sont similaires, mais il existe environ 24 893 éditeurs communs et c'est assez ridicule d'essayer d'ignorer toutes les différentes extensions de sauvegarde.)

En d'autres termes, ne mettez rien dedans .gitignoreou core.excludesdedans $GIT_DIR/config. Mettez les informations à la $HOME/.gitconfigplace (comme le suggère nunopolonia avec --global.) Notez que "global" signifie par utilisateur, pas par système.

Si vous voulez une configuration à travers le système pour tous les utilisateurs (ce que vous n'avez pas), vous aurez besoin d'un mécanisme différent. (Peut-être avec la configuration des modèles avant l'initialisation du référentiel.)

William Pursell
la source
3
Apparemment, Betty est beaucoup plus intelligente que Joe :-) Bon conseil et méritant un vote, même si j'ai fini par utiliser la réponse de martinl (en la corrigeant dans Vim plutôt que Git).
paxdiablo
11

Je recommanderais également de penser à ignorer les fichiers comme:

.*.swp
.*.swo

car vous pouvez avoir des fichiers se terminant par .swp

Anastasios Andronidis
la source
5

Quittez vim avant "git commit".

pour vimutiliser d'autres dossiers pour les fichiers de sauvegarde, ( /tmppar exemple):

set bdir-=.
set bdir+=/tmp

pour que vim cesse d'utiliser le dossier actuel pour les fichiers .swp:

set dir-=.
set dir+=/tmp

L'utilisation -=, +=serait généralement bonne, car vim a d'autres valeurs par défaut pour bdir, dir , nous ne voulons pas tout effacer. Consultez l'aide de vim pour en savoir plus sur bdir, dir :

:h bdir
:h dir
Andrew_1510
la source
5
Faites attention où vous stockez vos fichiers d'échange de vim. Vous pourriez accidentellement divulguer des informations d'identification ou d'autres données à partir d'un fichier que vous modifiez: security.stackexchange.com/questions/65883/…
Mnebuerquo
5

Voici le code VIM réel qui génère les extensions de fichier d'échange:

/* 
 * Change the ".swp" extension to find another file that can be used. 
 * First decrement the last char: ".swo", ".swn", etc. 
 * If that still isn't enough decrement the last but one char: ".svz" 
 * Can happen when editing many "No Name" buffers. 
 */
if (fname[n - 1] == 'a')        /* ".s?a" */
{   
    if (fname[n - 2] == 'a')    /* ".saa": tried enough, give up */
    {   
        EMSG(_("E326: Too many swap files found"));
        vim_free(fname);
        fname = NULL;
        break;  
    }
    --fname[n - 2];             /* ".svz", ".suz", etc. */
    fname[n - 1] = 'z' + 1;
}
--fname[n - 1];                 /* ".swo", ".swn", etc. */

Cela générera des fichiers d'échange au format:

[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]

Ce qui est à peu près ce qui est inclus dans le propre fichier gitignore de github pour VIM .

Comme d'autres l'ont correctement noté, ce .gitignore ignorera également les fichiers image .svg et les fichiers flash Adobe .swf .

rouble
la source
3

J'ai trouvé que git ignorerait les fichiers temporaires créés par vim:

[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~

Il peut également être consulté ici .

Instantané
la source
5
Il ignorera également les .swffichiers embêtants qui continuent d'apparaître chaque fois que vous créez une application flash.
stephenmurdoch
Ce qui fonctionne bien tant que vous n'êtes pas un développeur ayant besoin d'archiver vos fichiers Flash :-)
paxdiablo
1
Cela ignorera .svgce qui peut être un problème.
Bruno Bronosky
1
Il est redondant d'inclure *.un~puisque vous l'avez*~
Bruno Bronosky
2

sûr,

il suffit de créer un ".gitignore" sur le répertoire personnel de votre projet et de contenir

*.swp

c'est tout

en une seule commande

project-home-directory$ echo '*.swp' >> .gitignore
forellana
la source
4
Je pense echo *.swp >> .gitignorequ'il vaut mieux éviter de remplacer le précédent .gitignore.
Cesar A. Rivas
2
Vous ne voulez pas que le shell développe le '*'. Donc, utilisezecho '*.swp' >> .gitignore
Eddified
Vous ne voulez pas non plus manquer accidentellement l'un de ces >personnages. Une fois, j'ai fait cela dans le passwdfichier, puis je me suis déconnecté :-)
paxdiablo
2
# VIM: Temperory files
*~

# VIM: Swap-files
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]

# VIM: Commands :cs, :ctags
tags
cscope.*

# VIM session
Session.vim

# VIM: netrw.vim: Network oriented reading, writing, browsing (eg: ftp scp) 
.netrwhist

Le nom du fichier d'échange est normalement le même que le fichier que vous modifiez, avec l'extension ".swp".

  • Sous Unix, un '.' est ajouté pour permuter les noms de fichiers dans le même répertoire que le fichier modifié. Cela évite que le fichier d'échange apparaisse dans une liste de répertoires.
  • Sur les machines MS-DOS et lorsque l'option 'shortname' est activée, n'importe quelle '.' dans le nom de fichier d'origine est remplacé par '_'.
  • Si ce fichier existe déjà (par exemple, lorsque vous récupérez d'un crash) un avertissement est donné et une autre extension est utilisée, ".swo", ".swn", etc.
  • Un fichier existant ne sera jamais écrasé.
  • Le fichier d'échange est supprimé dès que Vim cesse de modifier le fichier.

Le remplacement de '.' avec '_' est fait pour éviter les problèmes avec les systèmes de fichiers compatibles MS-DOS (par exemple, crossdos, multidos).

http://vimdoc.sourceforge.net/htmldoc/recover.html

http://www.vim.org/scripts/script.php?script_id=1075

user31986
la source
0

Dans mon cas, les fichiers temporaires sont déjà validés par des actions précédentes, donc la modification de .gitignore n'affectera pas ces fichiers validés ..., vous devez d' git rm files_to_be_ignored --cacheabord, puis valider, puis DONE.

ddwolf
la source
0

Cela fonctionne sur un Mac, comme l'a noté Alex Moore-Niemi:

set backupdir=$TMPDIR//
set directory=$TMPDIR//

Assurez-vous d'utiliser TMPDIRet non TEMPDIR.

Pouvoirs
la source
-4

Si vous utilisez le contrôle de code source. les fichiers temporaires vim sont tout à fait inutiles.
Vous voudrez donc peut-être configurer vim pour ne pas les créer.

Modifiez simplement votre ~ / .vimrc et ajoutez ces lignes:

set nobackup
set noswapfile
Arnis Lapsa
la source
6
Le contrôle des sources ne fonctionne pas avec la même granularité que les sauvegardes ou les fichiers d'échange de Vim. Même si vous vous engagiez après chaque sauvegarde (ou après un certain nombre de caractères ou de secondes - une simplification de ce que les fichiers d'échange de Vim vous donnent), il est très probable que vous souhaitiez éditer des fichiers qui ne sont pas contrôlés par la source (pour quelles sauvegardes et les fichiers d'échange sont toujours souhaitables).
Chris Johnsen
8
Les fichiers temporaires VIM sont extrêmement utiles pour les plantages de l'éditeur et pour plusieurs autres raisons. Les éteindre, c'est jeter le bébé avec l'eau du bain.
Brian Riehman
5
@Arnis Say, une panne de courant? Ou faire mourir votre session X pour une raison quelconque. les fichiers temporaires vim sont assez importants IMO.
jrdioko
1
@jrdioko X crash est la raison pour laquelle on peut vouloir utiliser screen(ou dtachs'il ne veut pas toutes les fonctionnalités de l'écran). Les coupures de courant sont gérées par UPS. Les sauvegardes sont effectuées par {votre logiciel préféré pour sauvegarder tous les fichiers importants}. J'utilise des fichiers d'échange pour être averti lorsque j'essaie d'éditer des fichiers déjà modifiés, des fichiers de sauvegarde car avoir N + 1e place avec la sauvegarde ne nuit pas et annule les fichiers car l'annulation persistante est pratique. Seuls les fichiers d'annulation sont un peu importants pour moi.
ZyX
5
Il vaut mieux dire à vim de stocker les fichiers temporaires ailleurs que de les désactiver complètement.
Kyle