How do you cancel an external git diff?
I've got vim setup as my external diff tool:
[diff]
external = git_diff_wrapper
#!/bin/sh
vimdiff "$2" "$5"
Say I have 300 files that have been modified; via bash, I type "git diff". It launches 300 vimdiffs sequentially, how do I abort it?
Use :cquit to exit vim with an error code. Git will detect the error and stop opening new vimdiffs. You'll probably want to create a mapping for it in your .vimrc:
if &diff
map Q :cquit<CR>
endif
Then just hit Q to early abort from a git diff run.
In order for this to work you must edit your gitconfig:
git config --global difftool.trustExitCode true
git config --global mergetool.trustExitCode true
If stopping the process is not enough, killing the shell itself (in which you launched the git diff
) might be more effective.
See also Git Diff with Vimdiff
Not being ready to go full speed into using
vimdiff
(I’m just new to it), I put the following in ‘gitvimdiff
’.
The result is that I can usevimdiff
to look at git-diff by running ‘gitvimdiff
‘, but a normal invocation of ‘git diff
’ behaves as I’m used to.
#!/bin/sh
if [ -n "${GIT_EXTERNAL_DIFF}" ]; then
[ "${GIT_EXTERNAL_DIFF}" = "${0}" ] ||
{ echo “GIT_EXTERNAL_DIFF set to unexpected value” 1>&2; exit 1; }
exec vimdiff “$2″ “$5″
else
GIT_EXTERNAL_DIFF=”${0}” exec git –no-pager diff “$@”
fi
But if you still want the modified git diff
, a git status
might help before launching it ;)
And you can setup a function to get the old git diff
behavior if needed:
I still have access to the default git diff behavior with the
--no-ext-diff
flag. Here’s a function I put in my bash configuration files:
function git_diff() {
git diff --no-ext-diff -w "$@" | vim -R -
}
--no-ext-diff
: to prevent using vimdiff-w
: to ignore whitespace-R
: to start vim in read-only mode-
: to make vim act as a pager