Git忽略Vim临时文件

291
什么是在所有目录中使git忽略由vim生成的临时文件的正确方法(无论是全局跨系统还是针对单个项目本地)?

6
*.sw? 这个模式可以解决标准的 .swp,也包括一些备选的交换文件扩展名比如 .swo - buley
9
@buley您提出的建议还将忽略.swf文件。我强烈不建议这样做,尤其是如果您正在构建Flash应用程序。 - stephenmurdoch
1
@marflar 很好的观点。然而,使用以隐藏文件“.”为前缀的相同模式应该可以防止这种情况。 - buley
我今天也看到了一个 .swx 文件。 - Richard
4
实验表明,在创建了16个备份文件(.tmp.swp.tmp.swo、……、.tmp.swa)之后,vim会创建.tmp.svz。我没有耐心去看.tmp.saa之后会出现什么——也许是.tmp.rzz更新:查看源代码(src/memline.c,函数findswapname()),发现在.saa之后会因为错误" E326:找到太多的交换文件 "而放弃创建备份文件。 - Keith Thompson
不幸的是,enew 会创建 .swp 文件。 - D. Ben Knoble
13个回答

457

Vim的临时文件以~结尾,因此你可以在文件.gitignore中添加以下行:

*~

Vim还会创建一些扩展名为swp和swo的交换文件,可以使用以下命令删除:

*.swp
*.swo

这将忽略单个项目中的所有vim临时文件。

如果您想要全局地这样做,可以在您的主目录中创建一个.gitignore文件(您可以为其指定其他名称或位置),并使用以下命令:

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

你只需要将想要忽略的文件添加到那个文件中即可。

如果您想在 Git 文件中进行注释,必须在单独的一行上执行此操作:

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

在与活动的 git ignore 相同行的任何注释都会导致整行被错误解释。


33
Vim会创建一系列以不同名称命名的交换文件(.swp、.swo等),因此我在我的.gitignore文件中使用.*.sw*将它们全部隐藏起来。 - Drew Stephens
38
@DrewStephens,我认为.*.sw?更准确。(虽然我见过有人使用类似*.sw*的变体怀疑我是那个错过了某些非常明显的东西的人...) - Morten Siebuhr
11
根据 http://vimdoc.sourceforge.net/htmldoc/recover.html,.s?? 可以在 Unix 中捕获所有的备份文件(.s?? 的范围是从 .swp 到 .saa)。 - Max Nanasy
7
@MatrixFrog的评论很好,我来稍微补充一下——因为这个问题是关于vim的,你可以在该项目这里找到正确的.gitignore文件。请注意保留原文意思并使翻译更通俗易懂,不提供额外解释或内容。 - SnapShot
25
注意了,GitHub 的 .*.s[a-w][a-z] 将会忽略掉 .svg 文件。 - Jon
显示剩余9条评论

130

或者你可以配置 vim 将 swap 文件保存到单独的位置,例如通过在你的 .vimrc 文件中添加类似以下行:

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

查看此vim技巧以获取更多信息。


10
注意,在Mac OS X中,您可以使用"$TMPDIR"来获取实际的临时目录 :) - Alex Moore-Niemi
5
在你喜欢的目录后加双斜杠(例如我使用~/tmp//)可以通过存储完整路径来避免文件名冲突。这样,你仍然可以同时编辑两个目录中命名为config.xml的文件。 - Brian
1
$TEMP 是什么意思? - themefield
请注意,我还必须添加set undodir=$TEMP//,因为我还保存持久的撤消文件。 - Micah Lindstrom

32

这应该只在个人用户级别上进行,而不是每个仓库。如果Joe使用emacs,他将希望忽略emacs备份文件,但Betty(使用vi)将希望忽略vi备份文件(在很多情况下它们是相似的,但存在大约24,893个常见的编辑器,试图忽略所有这些备份扩展名是相当荒谬的)。

换句话说,不要在.gitignore或core.excludes或$GIT_DIR/config中加入任何内容。改为将信息放在$HOME/.gitconfig中(正如nunopolonia建议的那样,使用--global)。请注意,“全局”表示针对个人用户而非整个系统。

如果您想要跨系统为所有用户进行配置(实际上您不需要),则需要使用不同的机制。(可能需要在初始化存储库之前设置模板。)


3
显然,贝蒂比乔聪明得多 :-) 这是一条好建议,值得一票,尽管我最终使用了martinl的答案(在Vim中修复它而不是Git)。 - paxdiablo
这假设了一种我在大多数公司用户中没有发现的复杂程度。虽然忽略可能有几个编辑器文件很烦人,但它确实可以防止新人将其配置信息倾泻其中。让我们在这里保持理性,常用的编辑器只有五个左右。这并不足以担心将其添加到项目中的忽略列表中。 - Virmundi
1
@Virmundi,“防止新人倒入他们的配置”是一个不同层次的问题,应该通过预接收钩子来处理。(或至少在人工审核PR时处理。)用户的无知并不能成为杂乱代码库的借口。预接收钩子是教育用户的好地方,可以通过简洁的错误消息引导他们到内部政策的适当文档,并解释为什么他们个人的配置文件不应该存在于代码库中。 - William Pursell

12

我建议考虑忽略以下文件:

.*.swp
.*.swo

你可能拥有以.swp结尾的文件。


8

这里是实际的VIM代码,用于生成交换文件扩展名:

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

这将生成以下格式的交换文件:
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]

这基本上就是 GitHub 自带的 Git 忽略文件(VIM)的全部内容。正如其他人正确指出的那样,该 .gitignore 文件还会忽略 .svg 图像文件和 .swf Adobe Flash 文件。

5

在“git commit”之前退出vim。

要使vim使用其他文件夹进行备份文件(例如/tmp):

set bdir-=.
set bdir+=/tmp

停止使用当前文件夹作为.vim临时文件的存储位置:

set dir-=.
set dir+=/tmp

使用 -=, += 通常是不错的选择,因为 vim 对于 bdir, dir 有其他默认设置,我们并不想清除所有设置。更多关于 bdir, dir 的信息请查阅 vim 帮助文档:

:h bdir
:h dir

6
小心存储 vim 交换文件的位置。您可能会意外泄露正在编辑的文件中的凭据或其他数据:http://security.stackexchange.com/questions/65883/what-sensitive-information-can-be-leaked-in-a-vims-swap-file - Mnebuerquo

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

交换文件的名称通常与您正在编辑的文件相同,带有扩展名“.swp”。 在Unix上,在与编辑文件相同的目录中,为交换文件名添加“.”。这样可以避免交换文件出现在目录列表中。 在MS-DOS机器上,并且打开了“shortname”选项时,原始文件名中的任何“。”都将替换为“_”。 如果该文件已经存在(例如,当您正在从崩溃中恢复时),则会发出警告并使用另一个扩展名“.swo”,“.swn”等。 现有文件永远不会被覆盖。 交换文件在Vim停止编辑文件时立即删除。 将“.”替换为“_”是为了避免与MS-DOS兼容的文件系统(例如crossdos,multidos)出现问题。

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

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


4

我发现以下内容可以让Git忽略Vim创建的临时文件:

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

这个文件可以在 这里 查看。


5
它还将忽略那些让人烦恼的.swf文件,这些文件在制作Flash应用程序时经常弹出。 - stephenmurdoch
只要你不是需要检查 Flash 文件的开发人员,这个方法就很好用 :-) - paxdiablo
1
这将忽略 .svg,这可能会成为一个问题。 - Bruno Bronosky
1
包含 *.un~ 是多余的,因为你已经有了 *~ - Bruno Bronosky

3
当然,
您只需在项目的主目录中创建一个名为".gitignore"的文件,并确保其包含以下内容。
*.swp

一条命令搞定

只需一条命令即可完成

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

4
我认为使用 echo *.swp >> .gitignore 更好,可以避免覆盖之前的 .gitignore 文件。 - Cesar A. Rivas
2
你不想让shell扩展“*”。因此,请使用echo '*.swp' >> .gitignore - Eddified
你也不想意外地错过其中一个>字符。我曾经在passwd文件中犯过这样的错误,然后登出了 :-) - paxdiablo

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接