ChatGPT解决这个技术问题 Extra ChatGPT

git 忽略 vim 临时文件

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

模式 *.sw? 解决了标准的 .swp,但也解决了替代交换文件扩展名,如 .swo
@buley 您的建议也将忽略 .swf 个文件。我强烈反对这样做,特别是如果您正在构建 Flash 应用程序。
@marflar 好点。但是,以隐藏文件 . 为前缀的相同模式应该可以防止这种情况发生。
我今天也看到了一个.swx。
实验表明,在创建 16 个备份文件(.tmp.swp.tmp.swo、...、.tmp.swa)后,vim 会创建 .tmp.svz。我缺乏耐心去看看 .tmp.saa 之后会发生什么——也许是 .tmp.rzz更新:查看源代码(src/memline.c,函数 findswapname()),它在 .saa 后放弃并出现错误:“E326:找到太多交换文件”。

M
Metagrapher

Vim 临时文件以 ~ 结尾,因此您可以在文件 .gitignore 中添加该行

*~

Vim 还创建具有 swp 和 swo 扩展名的交换文件。删除那些使用以下行:

*.swp
*.swo

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

如果你想全局做,你可以在你家创建一个 .gitignore 文件(你可以给它其他名称或位置),并使用以下命令:

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

然后,您只需将要忽略的文件添加到该文件


Vim 将创建连续命名的交换文件(.swp、.swo 等),所以我在 .gitignore 中使用 .*.sw* 将它们全部隐藏。
@DrewStephens,我相信 .*.sw? 更准确。 (虽然我见过人们使用 *.sw* 的一些变体来怀疑我是那个遗漏了一些非常明显的东西的人......)
@Morten 根据 vimdoc.sourceforge.net/htmldoc/recover.html,.*.s??会在 Unix 上捕获它们(.s?? 从 .swp 减少到 .saa)。
只是为了稍微扩展一下@MatrixFrog 的优秀评论——因为这个问题是针对 vim 的,所以您可以在该项目 here 中找到正确的 .gitignore。
当心。 github 的 .*.s[a-w][a-z] 将忽略 .svg 文件。
R
Rolando Isidoro

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

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

有关详细信息,请参阅此 vim tip


注意,在 Mac OS X 中,您可以使用 $TMPDIR 来获取实际的 tempdir :)
首选目录后的双斜杠(我使用 ~/tmp//)通过存储完整路径来防止文件命名冲突。这样,您仍然可以同时在两个目录中编辑名为 config.xml 的文件。
$TEMP 是什么意思?
注意我还必须添加 set undodir=$TEMP//,因为我还保存了持久撤消文件。
W
William Pursell

这应该只在每个用户的基础上完成,而不是每个存储库。如果 Joe 使用 emacs,他会希望忽略 emacs 备份文件,但 Betty(使用 vi)会希望忽略 vi 备份文件(在许多情况下,它们是相似的,但现有大约 24,893 个通用编辑器,而且很漂亮试图忽略所有各种备份扩展是荒谬的。)

换句话说,不要在 .gitignore$GIT_DIR/config 中的 core.excludes 中添加任何内容。将信息放在 $HOME/.gitconfig 中(正如 nunopolonia 建议的 --global)。请注意,“全局”是指每个用户,而不是每个系统。

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


显然,Betty 比 Joe 聪明得多 :-) 很好的建议,值得投票,尽管我最终使用了 martinl 的答案(在 Vim 而不是 Git 中修复它)。
A
Anastasios Andronidis

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

.*.swp
.*.swo

因为您可能有以 .swp 结尾的文件


r
rouble

Here 是生成交换文件扩展名的实际 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 自己的 VIM 的 gitignore 文件中包含的内容。

正如其他人正确指出的那样,此 .gitignore 还将忽略 .svg 图像文件和 .swf adobe flash 文件。


A
Andrew_1510

在“git commit”之前退出 vim。

vim 使用其他文件夹来备份文件,(例如 /tmp):

set bdir-=.
set bdir+=/tmp

使 vim 停止使用当前文件夹存放 .swp 文件:

set dir-=.
set dir+=/tmp

使用 -=, += 通常会很好,因为 vim 对 bdir, dir 有其他默认值,我们不想全部清除。查看 vim 帮助以获取更多关于 bdir, dir 的信息:

:h bdir
:h dir

小心存储 vim 交换文件的位置。您可能会意外泄露正在编辑的文件中的凭据或其他数据:security.stackexchange.com/questions/65883/…
u
user31986
# 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


S
SnapShot

我发现这会让 git 忽略 vim 创建的临时文件:

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

也可以查看here


它还会忽略那些在您制作 Flash 应用程序时不断弹出的讨厌的 .swf 文件。
只要您不是需要签入 Flash 文件的开发人员,它就可以正常工作:-)
这将忽略可能有问题的 .svg
包含 *.un~ 是多余的,因为您有 *~
b
bishop

当然,

只需在项目的主目录上创建一个“.gitignore”并且必须包含

*.swp

而已

在一个命令中

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

我认为echo *.swp >> .gitignore最好避免覆盖以前的 .gitignore。
您不希望外壳扩展“*”。所以,使用 echo '*.swp' >> .gitignore
您也不想意外错过其中一个 > 字符。我曾经对 passwd 文件这样做然后注销:-)
d
ddwolf

在我的情况下,临时文件已由先前的操作提交,因此修改 .gitignore 不会影响那些提交的文件...,您必须先git rm files_to_be_ignored --cache,然后提交,然后完成。


P
Powers

正如 Alex Moore-Niemi 所指出的,这适用于 Mac:

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

确保使用 TMPDIR 而不是 TEMPDIR


A
Arnis Lapsa

如果您正在使用源代码管理。 vim 临时文件毫无用处。因此,您可能希望将 vim 配置为不创建它们。

只需编辑您的 ~/.vimrc 并添加以下行:

set nobackup
set noswapfile

源代码管理与备份或 Vim 的交换文件的粒度不同。即使您在每次保存后提交(或在一定数量的字符或秒后 - Vim 的交换文件给您的简化),您仍然很有可能想要编辑不受源代码控制的文件(对于哪些备份和交换文件仍然是可取的)。
VIM 临时文件对于编辑器崩溃和其他几个原因非常有用。关掉它们就是把婴儿和洗澡水一起扔出去。
@Arnis说,停电?或者让您的 X 会话因某种原因而死。 vim 临时文件是非常重要的 IMO。
@jrdioko X crash 是人们可能想要使用 screen 的原因(或者如果他不想要所有屏幕功能,则使用 dtach)。停电由 UPS 处理。备份由{您最喜欢的备份所有重要文件的软件}完成。当我尝试编辑已编辑的文件时,我使用交换文件来获得通知,备份文件,因为备份的第 N+1 位不会损害和撤消文件,因为持久撤消很方便。只有撤消文件对我来说有点重要。
你最好告诉 vim 将临时文件存储在别处,而不是完全关闭它们。