Ошибка при использовании команды:GDiff для fugitive.vim с использованием gvim для windows и msys git 1.7.0.2
Я использую git вместе с fugitive.vim для управления кодом, когда я в Windows. Однако я столкнулся с проблемой. Согласно документации, команда:GDiff должна открывать окно diff и позволять мне размещать только части файла. Однако когда я запускаю команду в файле с изменениями, я получаю следующее сообщение об ошибке:
Это проблема с окнами? ВИМ? Беглец? msysgit? файловые права? Кто-нибудь знает?
4 ответа
У меня была такая же проблема - вот как я это исправил.
По умолчанию Vim пытается сохранить файлы подкачки рядом с оригиналом. Беглец создает буфер, который не соответствует ни одному реальному пути к файлу, поэтому 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 должен использовать первый путь, который может.
У меня нет компьютера с Windows, но я смог воспроизвести и изолировать эту проблему в системе Mac OS X 10.6.
Либо создать C:\TMP
или же C:\TEMP
(:help 'directory'
говорит, что оба в значении по умолчанию directory
в Windows Vim) или добавьте существующий каталог к значению directory
вариант.
Я использую временный каталог для Vim в моем домашнем каталоге (опять же, здесь нет Windows) и добавляю две конечные косые черты (~/tmp/.vim-swaps//
). Этот тип настройки централизует файлы подкачки, но дает им уникальные имена на основе каталогов редактируемых файлов. Смотрите "Преимущества" и "Недостатки" в :help :swapname
а также бит "если каталог заканчивается двумя разделителями пути" в :help 'directory'
,
использование ^=
добавить 1 к вашему каталогу (чтобы он всегда использовался, если он существует):
set directory^=C:\\some\\existing\\directory//
Или используйте +=
добавить свой каталог (чтобы он использовался только в том случае, если он существует и не применяется directory
Записи существуют):
set directory+=C:\\some\\existing\\directory//
Ответ Чарльза предполагает, что $TMP
(ссылка на переменную окружения) может быть хорошим значением для Windows:
set directory+=$TMP//
Основная причина связана со значением по умолчанию directory
вариант в сочетании с путем :Gdiff
Индексный "псевдо" файл.
Буфер для индексной стороны :Gdiff
представление использует специальный путь, который выглядит как fugitive:///path/to/repository/.git//0/path/to/file/under/repository
(Беглец захватывает операции чтения и записи в так называемые буферы и перенаправляет их в индекс, вызывая команды Git "plumbing").
Первая запись в 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.
Я смог воспроизвести вашу проблему в системе Unix-y с помощью set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir
(т.е. принимая значение Unix по умолчанию и изменяя вхождения tmp
в no-such-dir
). Ни один из каталогов "no-such-dir" фактически не существовал. Я получаю ту же ошибку при использовании :Gdiff
,
1 :help :set^=
только говорит "добавить", но код показывает, что set listopt^=…
похож на то, как set listopt+=…
добавляет (как последний документально подтверждено). Оба должны автоматически вставлять запятые по мере необходимости (хотя в этой области могли быть ошибки).
Кстати, ту же ошибку я получил, когда попытался:gdiff несохраненный файл - когда я сохранил его (:w), он работает!
Это может быть связано с проблемой 428 msysgit, упомянутой в моем ответе SO.
Попробуйте залатать cmd/git.cmd
как я опишу в моем предыдущем ответе и посмотрим, поможет ли это.
Исходя из этого, остается 2 варианта:
- либо проблема с блокировкой (файл заблокирован процессом): такая утилита, как монитор процесса или проводник процесса, может помочь выяснить, так ли это (и какой дескриптор точно существует в этом файле подкачки)
- или проблема Git. Один хороший трюк - установить сетевой инсталлятор msysgit, который соберет последнюю версию Git для вашей Windows. Затем вы можете попытаться проверить, сохраняется ли проблема с этой обновленной версией.
Примечание: третий вариант, попытка понизить Git, снова исключить любую ссылку с этим инструментом.