如何防止git vimdiff以只读方式打开文件?

lau*_*ent 21 git vimdiff readonly difftool

我正在尝试使用vimdiff作为Git的diff工具,但由于某种原因,文件始终以只读模式打开.它对原始文件有意义,但对我修改过的文件没有意义(因为我尚未提交它们).

这是我目前的.gitconfig:

[diff]
        tool = vimdiff
[merge]
        tool = vimdiff
[difftool]
        prompt = false
Run Code Online (Sandbox Code Playgroud)

知道是什么原因引起的吗?

buk*_*zor 18

git用于vimdiff的deafult命令是:(通过检查进程列表找到)

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"'

报价很棘手.我会复制粘贴它.


Shu*_*nya 16

这是vimdiff的默认所需行为.您可以取消设置:set noro.

  • 在vimrc文件中,构造以下行:set noro (4认同)
  • 您是否会考虑扩展此答案以解释为什么它是默认的期望行为? (4认同)
  • 只读不是vimdiff的默认行为。试试看:`vimdiff thisfile thatfile`。调用vimdiff时,Git通过-R(只读模式)。有没有办法告诉git不要这样做? (3认同)
  • @BAdhi _“如果删除只读选项并在上一次提交中意外地编辑了文件,会发生什么?” _没关系,因为它只是tmp目录中文件的副本。不可能更改以前的git commit。 (2认同)

wis*_*cky 8

发生这种情况的原因是因为 gitvimdiff使用-R(readonly) 选项进行调用。有几种解决方案可以写入文件:

  1. :w!在vim中使用。即使它以只读方式打开,这也会强制写入。

  2. 您可以编辑~/.gitconfig以覆盖 vimdiff 命令,而无需-R

    [difftool "vimdiff"]
    cmd = vimdiff "$LOCAL" "$REMOTE"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以编辑~/.vimrc以始终使 vimdiff 可写。(这将影响所有 vimdiff,而不仅仅是 git。)

    if &diff
        set noreadonly
    endif
    
    Run Code Online (Sandbox Code Playgroud)