Ошибка при использовании команды: 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) он работает!