使用gvim for windows和msys git 1.7.0.2的fugitive.vim的:GDiff命令时出错

时间:2010-05-28 20:43:59

标签: git vim msysgit vim-fugitive

当我在Windows上时,我一直在使用git和fugitive.vim来管理代码。但是,我遇到了一个问题。根据{{​​3}},:GDiff命令应该是一个diff窗口,并允许我只放置文件的一部分。但是,当我在包含更改的文件中发出命令时,我收到以下错误消息: alt text

这是Windows的问题吗? VIM?逃犯? msysgit?文件权限?有人知道吗?

4 个答案:

答案 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:\TMPC:\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开始后续输入。

.作为第一个directoryfugitive:///path/to/repository/.git//0/path/to/file/under/repository的首选交换文件将为fugitive:///path/to/repository/.git//0/path/to/file/under/.repository.swp。此路径名(fugitive:pathto等)的主要组件可能不存在,因此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个选项:

  • 是否存在锁定问题(文件被进程锁定):像process monitorprocess explorer这样的实用程序可能有助于查看是否是这种情况(以及该交换的具体处理方式)文件)
  • 或Git问题。一个好方法是安装msysgit的net-installer,它将在你的Windows上构建最新版本的Git。然后,您可以尝试查看该更新版本是否仍存在问题 注意:第三个选项,尝试降级Git,再次排除与该工具的任何链接。

答案 3 :(得分:1)

BTW同样的错误,当我尝试:gdiff未保存的文件 - 当我保存它(:w)它有效!