303

What is the correct way to make git ignore temporary files produced by vim in all directories (either globally across the system or locally for a single project)?

8
  • 6
    The pattern *.sw? solves the standard .swp but also the alternative swap file extensions like .swo. Commented Apr 8, 2012 at 19:30
  • 9
    @buley your suggestion will also ignore .swf files. I would strongly discourage doing that, especially if you're building a Flash app. Commented May 12, 2014 at 11:23
  • 1
    @marflar Good point. Same pattern prefixed with the hidden file . should prevent that however. Commented May 13, 2014 at 15:38
  • 1
    I saw a .swx today too. Commented May 14, 2015 at 3:37
  • 4
    Experiment shows that after creating 16 backup files (.tmp.swp, .tmp.swo, ..., .tmp.swa), vim creates .tmp.svz. I lack the patience to see what comes after .tmp.saa -- perhaps .tmp.rzz? UPDATE: Looking in the source (src/memline.c, function findswapname()), it gives up after .saa with an error: "E326: Too many swap files found". Commented Jul 15, 2016 at 23:53

13 Answers 13

473

Vim temporary files end with ~ so you can add to the file .gitignore the line

*~

Vim also creates swap files that have the swp and swo extensions. to remove those use the lines:

*.swp
*.swo

This will ignore all the vim temporary files in a single project

If you want to do it globally, you can create a .gitignore file in your home (you can give it other name or location), and use the following command:

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

Then you just need to add the files you want to ignore to that file.

If you want to comment in a Git file you must do this on a separate line:

# Ignore vim files:
*~
*.swp
*.swo

Any comments placed on the same line as an active git ignore will cause the whole line to be misinterpreted.

Sign up to request clarification or add additional context in comments.

16 Comments

Vim will create successively named swap files (.swp, .swo, etc.), so I use .*.sw* in my .gitignore to hide them all.
@DrewStephens, I believe .*.sw? to be more accurate. (Though I've seen people use some variant of *.sw* to suspect I'm the one missing something really obvious...)
@Morten According to vimdoc.sourceforge.net/htmldoc/recover.html, .*.s?? would catch them all on Unix (the .s?? decrements from .swp to .saa).
Just to expand on @MatrixFrog excellent comment a bit - since this question is for vim you can find the correct .gitignore in that project here.
Be careful. github's .*.s[a-w][a-z] will ignore .svg files.
|
133

Alternatively you can configure vim to save the swapfiles to a separate location, e.g. by adding lines similar to the following to your .vimrc file:

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

See this vim tip for more info.

4 Comments

note, in Mac OS X, you can use $TMPDIR to get the actual tempdir :)
The double forward slash after your preferred directory (I use ~/tmp//) prevents file naming collisions by storing the full path. That way, you can still edit files named, for example, config.xml in two directories at the same time.
What does $TEMP mean?
Note I also had to add set undodir=$TEMP//, since I also save persistent undo files.
38

This is something that should only be done on a per-user basis, not per-repository. If Joe uses emacs, he will want to have emacs backup files ignored, but Betty (who uses vi) will want vi backup files ignored (in many cases, they are similar, but there are about 24,893 common editors in existence and it is pretty ridiculous to try to ignore all of the various backup extensions.)

In other words, do not put anything in .gitignore or in core.excludes or in $GIT_DIR/config. Instead, put the info in $HOME/.gitconfig (modern git allows you to use $HOME/.config/git/ignore).

However, if you want configuration across the system for all users (which you don't), you can use git config --system core.excludesFile /path/to/system/gitignore.

3 Comments

Apparently, Betty is much smarter than Joe :-) Good advice and deserving of a vote, even though I ended up using the answer from martinl (fixing it in Vim rather than Git).
This assumes a level of sophistication I don't find in most corporate users. While annoying that an ignore might have several editor files, it does protect against new people dumping their configs in. Let's be rational here, there are like 5 editors in common use. That's not enough to fret about adding to an ignore in the project.
@Virmundi "Protecting against new people dumping their configs in" is a different level of problem, which should be handled by a pre-receive hook. (Or at the very least during human review of the PR.) User's ignorance is not an excuse for cluttering the repository. A pre-receive hook is a great place to educate the user with a succinct error message directing them to the appropriate documentation on internal policies and an explanation of why their personal configs ought not be in the repo.
12

I would also recommend to think to ignore files like:

.*.swp
.*.swo

as you may have files that end with .swp

Comments

12

Here is the actual Vim code that generates the swap file extensions:

/* 
 * 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. */

This will generate swap files of the format:

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

Which is pretty much what is included in GitHub's own .gitignore file for Vim.

As others have correctly noted, this .gitignore will also ignore .svg image files and .swf adobe flash files.

Comments

5

Quit vim before "git commit".

to make vim use other folders for backup files, (/tmp for example):

set bdir-=.
set bdir+=/tmp

to make vim stop using current folder for .swp files:

set dir-=.
set dir+=/tmp

Use -=, += would be generally good, because vim has other defaults for bdir, dir, we don't want to clear all. Check vim help for more about bdir, dir:

:h bdir
:h dir

1 Comment

Be careful where you store your vim swap files. You could accidentally leak credentials or other data from a file you are editing: security.stackexchange.com/questions/65883/…
5
# 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

The name of the swap file is normally the same as the file you are editing, with the extension ".swp".

  • On Unix, a '.' is prepended to swap file names in the same directory as the edited file. This avoids that the swap file shows up in a directory listing.
  • On MS-DOS machines and when the 'shortname' option is on, any '.' in the original file name is replaced with '_'.
  • If this file already exists (e.g., when you are recovering from a crash) a warning is given and another extension is used, ".swo", ".swn", etc.
  • An existing file will never be overwritten.
  • The swap file is deleted as soon as Vim stops editing the file.

The replacement of '.' with '_' is done to avoid problems with MS-DOS compatible filesystems (e.g., crossdos, multidos).

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

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

Comments

4

I found this will have git ignore temporary files created by vim:

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

It can also be viewed here.

4 Comments

It will also ignore those pesky .swf files that keep popping up whenever you make a flash app.
Which works fine as long as you're not a developer needing to check in your Flash files :-)
This will ignore .svg which may be a problem.
It is redundant to include *.un~ since you have *~
4

There exists an excellent collection of .gitignore files over at the github/gitignore repository.

Here's the relevant Vim.gitignore file (as of 2024/02/15):

# Swap
[._]*.s[a-v][a-z]
!*.svg  # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]

# Session
Session.vim
Sessionx.vim

# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~

4 Comments

Hi Alex - this answer is a little too terse. Answers that only point to a link are highly discouraged, for two reasons. One, if (if not when) the link breaks, it renders the answer moot. Secondly (and related to the first), the answer ideally should have at least some minimal code that another user can directly use to apply to their problem. A link is more of a "see also" reference. Here, the best thing to do would be to copy the Global/Vim.gitignore file into your answer as quoted text, with your URL being the credit to the source of the information.
Thanks for the feedback @Randall! My only objection with pasting the code here is that if the source is updated, then the code in the answer becomes outdated, and any other users who may use it will find out the hard way that it's not working. Visiting the link above is just one more click and has the benefit of showing the user that there are tons of ready-made .gitignore files, which they might use in other projects in the future.
Glady! In my general experience, it seems like dead or broken/moved links tend to be the bane of existence over outdated info. But you do have a valid point, and I think the way you handled it with the "as of..." is a perfect approach!
This should be way up to be honest, it includes a lot more than other answers
3

sure,

just have to create a ".gitignore" on the home directory of your project and have to contain

*.swp

that's it

in one command

project-home-directory$ echo '*.swp' >> .gitignore

3 Comments

I think echo *.swp >> .gitignore it better to avoid override of the previous .gitignore.
You don't want the shell to expand the '*'. So, use echo '*.swp' >> .gitignore
You also don't want to accidentally miss one of those > characters. I once did that to the passwd file then logged out :-)
0

In myy case the temporary files are already commited by previous actions, so modifying .gitignore will not affect those commited files..., you have to git rm files_to_be_ignored --cache first, then commit, then DONE.

Comments

0

This works on a Mac as noted by Alex Moore-Niemi:

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

Make sure to use TMPDIR and not TEMPDIR.

Comments

-6

If You are using source control. vim temp files are quite useless.
So You might want to configure vim not to create them.

Just edit Your ~/.vimrc and add these lines:

set nobackup
set noswapfile

10 Comments

Source control does not operate at the same granularity as either backups or Vim’s swapfiles. Even if you were committing after every save (or after a certain number of characters or seconds — a simplification of what Vim’s swapfiles give you), it is still highly likely that you might want to edit files that are not source controlled (for which backups and swapfiles are still desirable).
VIM temporary files are extremely useful for editor crashes and for several other reasons. Turning them off is throwing out the baby with the bath water.
@Arnis Say, a power outage? Or having your X session die for some reason. vim temp files are quite important IMO.
@jrdioko X crash is the reason why one may want to use screen (or dtach if he does not want all screen features). Power outages are handled by UPS. Backups are done by {your favourite software for backing up all important files}. I use swap files to get notified when I try to edit files that is already edited, backup files because having N+1'th place with backup does not harm and undo files because persistent undo is handy. Only undo files are a bit important for me.
You are better off telling vim to store temp files elsewhere than completely turning them off.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.