Ошибка при использовании команды: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, снова исключить любую ссылку с этим инструментом.
Другие вопросы по тегам