Как запретить git vimdiff открывать файлы только для чтения?

Я пытаюсь использовать vimdiff в качестве инструмента сравнения для Git, но по какой-то причине файлы всегда открыты в режиме только для чтения. Это имеет смысл для исходного файла, но не для тех, которые я модифицировал (поскольку я их еще не зафиксировал).

Это мой текущий .gitconfig:

[diff]
        tool = vimdiff
[merge]
        tool = vimdiff
[difftool]
        prompt = false

Любая идея, что может быть причиной этого?


person laurent    schedule 31.08.2013    source источник


Ответы (3)


Это желаемое поведение по умолчанию для vimdiff. Вы можете отключить с помощью :set noro.

Или в вашей конфигурации .vimrc добавьте это:

" Default to not read-only in vimdiff
set noro
person Shunya    schedule 31.08.2013
comment
Знаете ли вы, есть ли способ настроить vimdiff так, чтобы эта опция всегда была включена? - person laurent; 31.08.2013
comment
В вашем файле vimrc создайте следующую строку: set noro - person Shunya; 01.09.2013
comment
@Laurent, пока я обращался за помощью к vim, я нашел этот URL-адрес (он может вам помочь). Пожалуйста, проверьте нижнюю часть страницы, на которой написано Изменить файлы для чтения/только для чтения/записи при их редактировании. URL: vim.wikia.com/wiki/. Я думаю, это должно быть частью вашего файла конфигурации vimrc. Пожалуйста, обновите, если это работает нормально. - person Shunya; 02.09.2013
comment
спасибо, но на самом деле вариант noro — это именно то, что я искал, так как я предпочитаю иметь возможность редактировать diff по умолчанию (я часто делаю некоторую очистку измененных файлов перед фиксацией). - person laurent; 02.09.2013
comment
Не могли бы вы расширить этот ответ, чтобы объяснить, почему это желаемое поведение по умолчанию? - person amcnabb; 21.03.2014
comment
Только чтение не является поведением vimdiff по умолчанию. Попробуйте: vimdiff thisfile thatfile. Git передает -R (режим только для чтения) при вызове vimdiff. Есть ли способ сказать git, чтобы он этого не делал? - person bukzor; 12.08.2014
comment
Что произойдет, если вы удалите опцию только для чтения и случайно отредактируете файл в предыдущем коммите? - person BAdhi; 07.12.2016
comment
@BAdhi Что произойдет, если вы удалите параметр только для чтения и случайно отредактируете файл в предыдущем коммите? Это не имеет значения, потому что это просто копия файла в каталоге tmp. Невозможно изменить предыдущий коммит git. - person wisbucky; 27.04.2018
comment
Хоть и из прошлого, но до сих пор актуально. Этот ответ был выбран слишком быстро в качестве ответа. Как уже упоминал @bukzor, то, что он говорит о поведении vimdiff по умолчанию, неверно. но, к счастью, это одно из тех не 100%-правильных решений, которое работает! Полный ответ может быть ответом от wisbucky bellow. - person roxch; 29.10.2020

Команда deafult, которую git использует для vimdiff: (найдена путем проверки списка процессов)

vim -R -f -d -c "wincmd l" -c 'cd "$GIT_PREFIX"' "$LOCAL" "$REMOTE"

Вы можете переопределить это (чтобы не использовать -R, режим только для чтения), установив переменную difftool.vimdiff.cmd.

$ git config --global difftool.vimdiff.cmd 'vim -f -d -c "wincmd l" -c '\''cd "$GIT_PREFIX"'\'' "$LOCAL" "$REMOTE"'

Цитирование сложное. Я бы скопипастил.

person bukzor    schedule 11.08.2014
comment
это может быть какая-то ошибка, прямо добавьте набор noreadonly в ваш файл vimrc. - person liuyang1; 30.09.2014
comment
@Procras: Я думаю, вы случайно слово. - person bukzor; 30.09.2014
comment
@alexis, ты все еще пропустил начальную двойную кавычку для последнего слова. пожалуйста, добавьте его, чтобы сделать копирование/вставку безопасным для других пользователей - person ZuBB; 07.08.2016
comment
@ZuBB да !, спасибо. Я не могу редактировать старый комментарий, поэтому напишу его здесь снова: я просто поставил [difftool "vimdiff"] cmd = vim -f -d -c 'wincmd l' -c 'cd "$GIT_PREFIX"' "$LOCAL" "$REMOTE" в ~/.gitconfig - person alexis; 08.08.2016

Это происходит потому, что git вызывает vimdiff с опцией -R (только для чтения). Есть несколько решений для записи в файл:

  1. Используйте :w! в vim. Это заставит писать, даже если он был открыт только для чтения.

  2. Вы можете отредактировать ~/.gitconfig, чтобы переопределить команду vimdiff без -R

    [difftool "vimdiff"]
    cmd = vimdiff "$LOCAL" "$REMOTE"
    
  3. Вы можете отредактировать ~/.vimrc, чтобы сделать vimdiff всегда доступным для записи. (Это повлияет на весь vimdiff, а не только на git.)

    if &diff
        set noreadonly
    endif
    
person wisbucky    schedule 26.04.2018
comment
Первый вариант безопасен и прост. - person Gagan; 06.06.2021