我使用 vimdiff 作为 git 的 difftool。
假设我更改了 12 个文件。问题是,有时我运行git diff
并在第四或第五个文件附近看到一些我想编辑/更改的内容。有时我需要在此之外进行一些更改。问题是我不能就这样:qa
回去继续 hacking,因为 vimdiff 中会弹出六七个 diff。:qa
如果不每次我想中止 git diff 时都查看所有这些文件,那就太乏味了。
有没有办法将 vimdiff 设置为 git 的 difftool,以便所有差异都在同一个 vim 实例中打开,例如在单独的选项卡中?
答案1
你可以使用已发布的 vim 插件这里. 然后你只需要设置 difftool:
[multidiff]
tool = vd -f
作为一个替代应用程序,我建议使用meld
它来显示已修改的文件 - 然后您可以只选择您想要查看差异的文件。
查看截图在这里举个例子。
进一步听取 Marcos 的有用评论,作为第三种(手动替代方案),如果您想使用,vimdiff
我建议meld
在脚本中遵循以下策略(可能python
):
- 使用
git diff-files --name-status
并git diff-index --name-status --cached HEAD
识别需要检查的文件。 - 获取这些文件的缓存版本并放置在
/tmp/
- 一次打开所有这些文件 - 已更改的文件及其缓存版本 -
vimdiff
尽管从您需要的意义上来说很可能无法实现 - 请参阅下文。
但是,由于vimdiff
它本身似乎无法处理多个不同的选项卡,因此我建议您使用上面的其他建议之一。
答案2
一个非常简单的解决方法是在 ~/.gitconfig 文件中添加此选项
[difftool]
tool = vimdiff $LOCAL $REMOTE
prompt = true
这样,在每次文件比较之前,系统都会提示您,您可以通过回答“否”来跳过文件,或者使用 Ctrl+C 中止文件比较
例子:
$ git difftool
Viewing: 'file1.js'
Launch 'vimdiff' [Y/n]: y
2 files to edit
Viewing: 'file2.js'
Launch 'vimdiff' [Y/n]: n
答案3
答案4
我想出了以下脚本来实现 git difftoll + vimdiff 提供的行为,但使用标签:
#!/bin/bash
commit1=$1
commit2=$2
files=`git diff ${commit1} ${commit2} --name-only`
cmd="set nosplitright | set nobackup | set noswapfile"
EXE="| silent exe"
for f in $files; do
if [ -z "$commit2" ]; then
cmd+="$EXE ':tabnew $f'"
else
cmd+="$EXE ':tabnew | f <${commit2}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit2}:$f'"
fi
cmd+="$EXE ':0 | filetype detect'"
cmd+="$EXE ':vnew | f <${commit1}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit1}:$f'"
cmd+="$EXE ':0 | filetype detect'"
cmd+="$EXE ':windo diffth'"
done
cmd+="$EXE 'bd 1 | tabfirst'"
vim -c "$cmd"
像这样调用它:
vimgd <commit1> <commit2>