Ошибка при использовании команды: GDiff для fugitive.vim с использованием gvim для windows и msys git 1.7.0.2
Я использовал git вместе с fugitive.vim для управления кодом, когда я нахожусь в окнах. Однако я столкнулся с проблемой. Согласно документации, команда: GDiff должна иметь окно diff и разрешить создавать только части файла. Однако, когда я выдаю команду в файле с изменениями, появляется следующее сообщение об ошибке:
![alt text]()
Это проблема с окнами? ВИМ? Беглец? msysgit? разрешения файлов? Кто-нибудь знает?
Ответы
Ответ 1
У меня была такая же проблема - вот как я ее исправил.
По умолчанию 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
EDIT:
Как показано ниже, fow, возможно, лучше использовать что-то вроде следующего:
set directory+=,~/tmp,$TMP
Vim должен использовать первый путь, который он может использовать.
Ответ 2
У меня нет машины 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//
Ответ Charles предполагает, что $TMP
(ссылка на переменную окружения) может быть хорошим значением для Windows:
set directory+=$TMP//
Основная причина связана с значением по умолчанию параметра directory
в сочетании с именем пути :Gdiff
s index "псевдо".
Буфер для стороны индекса представления :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.
Я смог воспроизвести вашу проблему в системе Unix-y, используя set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir
(т.е. принимая значение Unix по умолчанию и изменяя вхождения от tmp
до no-such-dir
). На самом деле ни одна из каталогов "нет-такого-dir" не существовала. Я получил ту же ошибку, когда я использую :Gdiff
.
1:help :set^=
говорит только "add", но код показывает, что set listopt^=…
добавляет аналогично тому, как set listopt+=…
добавляет (поскольку последний задокументировано). Оба должны автоматически вставлять запятые по мере необходимости (хотя в этой области могут быть ошибки).
Ответ 3
Это может быть связано с проблемой проблемы 428 msysgit, упомянутой в моем ответе SO.
Попробуйте исправить cmd/git.cmd
, как я описал в своем предыдущем ответе, и посмотреть, не поможет ли эта помощь.
Отказавшись от этого, осталось 2 варианта:
- либо проблема блокировки (файл заблокирован процессом): такая утилита, как монитор процесса или explorer может помочь выяснить, имеет ли это значение (и какой дескриптор именно в этом файле подкачки)
- или Git. Один хороший трюк заключается в том, чтобы установить net-installer из msysgit, который построит последнюю версию Git на вашей Windows. Затем вы можете попытаться выяснить, сохраняется ли проблема с этой обновленной версией.
Примечание: третий вариант, пытающийся понизить Git, снова, чтобы исключить любую ссылку с этим инструментом.
Ответ 4
Кстати, я ошиблась, когда попыталась: gdiff несохраненный файл - когда я его сохранил (: w) он работает!