Как отменить внешний git diff?

У меня есть vim setup как мой инструмент внешнего разграничения:

[diff]
        external = git_diff_wrapper

#!/bin/sh

vimdiff "$2" "$5"

Скажем, у меня есть 300 файлов, которые были изменены; через bash, я печатаю "git diff". Он запускает 300 vimdiffs последовательно, как мне его прервать?

Ответы

Ответ 1

Если остановить процесс недостаточно, возможно, более эффективно убить сам оболочку (в которой вы запустили git diff).

http://trick.vanstaveren.us/wp/wp-uploads/2009/06/close-this-window.png


См. также Git Diff с Vimdiff

VimDiff

Не будучи готовым перейти на полную скорость при использовании vimdiff (Im просто новый для него), я помещаю следующее в 'gitvimdiff.
В результате я могу использовать vimdiff для просмотра git -diff, запустив 'gitvimdiff', но нормальный вызов 'git diff ведет себя так, как я использовал.

#!/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 "[email protected]"
fi

Но если вы все еще хотите изменить git diff, git status может помочь перед его запуском;)

И вы можете настроить функцию, чтобы при необходимости получить старое поведение git diff:

У меня все еще есть доступ к по умолчанию git diff с флагом --no-ext-diff. Вот функция, которую я вложил в конфигурационные файлы bash:

function git_diff() {
  git diff --no-ext-diff -w "[email protected]" | vim -R -
}
  • --no-ext-diff: для предотвращения использования vimdiff
  • -w: игнорировать пробелы
  • -R: запустить vim в режиме только для чтения
  • -: сделать vim действующим как пейджер

Ответ 2

Использование: cquit для выхода из vim с кодом ошибки. Git обнаружит ошибку и прекратит открытие новых vimdiffs. Вероятно, вы захотите создать сопоставление для него в вашем .vimrc:

if &diff
  map Q :cquit<CR>
endif

Затем просто нажмите Q, чтобы досрочно прервать выполнение пробела Git.

Чтобы это сработало, вы должны отредактировать свой gitconfig:

git config --global difftool.trustExitCode true
git config --global mergetool.trustExitCode true

Ответ 3

Просто убейте родительский процесс. Откройте терминал, используйте pstree -p, чтобы найти идентификатор процесса (PID) процесса git, а затем kill -9. В моей системе это выглядит примерно так:

$ pstree -p
...
        ├─gnome-terminal(20473)─┬─bash(10302)───git(10331)───pager(10332)
...
$ kill -9 10331

Не совсем элегантный, но он работает. В вашей системе pager, вероятно, будет чем-то другим, но в качестве родительского процесса будет git.