当我在Windows上时,我一直在使用git和fugitive.vim来管理代码。但是,我遇到了一个问题。根据{{3}},:GDiff命令应该是一个diff窗口,并允许我只放置文件的一部分。但是,当我在包含更改的文件中发出命令时,我收到以下错误消息:
这是Windows的问题吗? VIM?逃犯? msysgit?文件权限?有人知道吗?
答案 0 :(得分:14)
我遇到了同样的问题 - 这就是我修复它的方法。
默认情况下,Vim会尝试在原始文件旁边存储交换文件。 Fugitive创建一个与任何实际文件路径不对应的缓冲区,因此Vim barfs尝试创建交换文件时。解决方案是确保Vim具有可以写入的路径。
以下是我修复此问题的方法:
if has("win32") || has("win64")
set directory=$TMP
else
set directory=~/tmp
end
以下是GitHub上的原始问题: https://github.com/tpope/vim-fugitive/issues/9
修改强>
如fow所述,最好使用以下内容:
set directory+=,~/tmp,$TMP
Vim应该使用它的第一条路径。
答案 1 :(得分:2)
我没有Windows机器,但我能够在Mac OS X 10.6系统上重现并隔离此问题。
创建C:\TMP
或C:\TEMP
(:help 'directory'
表示两者都在Vim的Windows版本的directory
选项的默认值中),或者添加现有的目录到directory
选项的值。
我在我的主目录下使用了一个特定于Vim的临时目录(同样,这里没有Windows)并添加两个尾部斜杠(~/tmp/.vim-swaps//
)。这种设置集中了交换文件,但根据正在编辑的文件的目录为它们提供唯一的名称。请参阅:help :swapname
中的“优势”和“缺点”以及
“如果目录以两个路径分隔符结尾”位于:help 'directory'
。
使用^=
在您的目录前加上 1 (以便始终使用它,如果存在的话):
set directory^=C:\\some\\existing\\directory//
或者,使用+=
附加您的目录(以便仅在存在时才使用它,并且不存在其他适用的directory
条目):
set directory+=C:\\some\\existing\\directory//
Charles’ answer表明$TMP
(对环境变量的引用)可能是Windows的一个好价值:
set directory+=$TMP//
根本原因与directory
选项的默认值以及:Gdiff
索引“伪”文件的路径名相关。
:Gdiff
视图的索引端缓冲区使用一个看起来像fugitive:///path/to/repository/.git//0/path/to/file/under/repository
的特殊路径名(逃逸捕获对这些命名缓冲区的读写,并通过调用Git将它们重定向到索引“管道“命令)。
directory
中的第一个条目通常是.
。这意味着Vim将尝试将交换文件放在与编辑文件相同的目录中(即foo/bar.txt
将尝试使用foo/.bar.swp
)。如果无法创建此首选交换文件,则将尝试从directory
开始后续输入。
将.
作为第一个directory
,fugitive:///path/to/repository/.git//0/path/to/file/under/repository
的首选交换文件将为fugitive:///path/to/repository/.git//0/path/to/file/under/.repository.swp
。此路径名(fugitive:
,path
,to
等)的主要组件可能不存在,因此Vim将继续directory
的下一个条目。如果其他directory
条目都不可用于创建交换文件(例如它们不存在),则会收到错误E302。
我能够使用set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir
在Unix-y系统上重现您的问题(即采用默认的Unix值并将tmp
的出现次数更改为no-such-dir
)。实际上并不存在“no-such-dir”目录。当我使用:Gdiff
时,我收到了同样的错误。
1
:help :set^=
仅表示“添加”,但代码显示set listopt^=…
的前缀类似于set listopt+=…
的附加方式(后者有记录要做)。两者都应该根据需要自动插入逗号(虽然这个区域可能存在错误)。
答案 2 :(得分:1)
这可能与issue 428 of msysgit mentioned in my SO answer。
有关尝试修补我在上一个回答中描述的cmd/git.cmd
,看看是否有帮助。
Baring that,仍有2个选项:
答案 3 :(得分:1)
BTW同样的错误,当我尝试:gdiff未保存的文件 - 当我保存它(:w)它有效!