Ошибка при использовании команды: GDiff fugitive.vim при использовании gvim для windows и msys git 1.7.0.2 - PullRequest
11 голосов
/ 29 мая 2010

Я использую git вместе с fugitive.vim для управления кодом, когда я нахожусь в Windows. Однако я столкнулся с проблемой. Согласно документации , команда: GDiff должна открыть окно diff и позволить мне размещать только части файла. Однако, когда я запускаю команду в файле с изменениями, я получаю следующее сообщение об ошибке: alt text

Это проблема с windows? ВИМ? Беглец? msysgit? права доступа к файлу? Кто-нибудь знает?

Ответы [ 4 ]

14 голосов
/ 01 мая 2011

У меня была такая же проблема - вот как я ее исправил.

По умолчанию 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

EDIT:

Как указывает fow ниже, вероятно, лучше использовать что-то вроде следующего:

set directory+=,~/tmp,$TMP

Vim должен использовать первый путь, который может.

2 голосов
/ 07 мая 2011

У меня нет компьютера с 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+=… (как это задокументировано для последнего). Оба должны автоматически вставлять запятые по мере необходимости (хотя в этой области могли быть ошибки).

1 голос
/ 09 января 2011

Кстати, та же ошибка, что и у меня, когда я пытался: gdiff - несохраненный файл - когда я его сохранял (: w), он работает!

1 голос
/ 29 мая 2010

Это может быть связано с проблемой 428 msysgit, упомянутой в моем SO-ответе .

Попробуйте внести исправления в cmd/git.cmd, как я описал в моем предыдущем ответе, и посмотрите, поможет ли это.

С учетом этого остается 2 варианта:

  • либо проблема с блокировкой (файл заблокирован процессом): такая утилита, как монитор процесса или проводник процесса может помочь определить, так ли это (и какой указатель именно в этом файле подкачки)
  • или проблема с Git. Один хороший трюк - установить сетевой инсталлятор msysgit, который соберет последнюю версию Git на вашей Windows. Затем вы можете попытаться проверить, сохраняется ли проблема с этой обновленной версией.
    Примечание: третий вариант - попытка понизить версию Git, снова исключить любую ссылку с этим инструментом.
...