如何取消外部 Git 差异?

19

我已经设置vim为我的外部diff工具:

[diff]
        external = git_diff_wrapper

#!/bin/sh

vimdiff "$2" "$5"

假设我有300个文件已经被修改了;在bash中,我输入"git diff"。它会顺序地启动300个vimdiff,如何中止它们?


1
请注意,相同的解决方案也可以用于 git mergetool - user202729
3个回答

25

使用 :cquit 命令退出 vim,并附上错误代码。Git 将检测到该错误并停止打开新的 vimdiff。您可能需要在 .vimrc 中为其创建映射:


    nnoremap <Leader>q :cquit<CR>
if &diff
  map Q :cquit<CR>
endif

按下 Q 键可提前退出 Git 差异运行。

为了使此功能正常工作,您必须编辑您的 gitconfig 文件:

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

5
这应该被接受作为答案,因为它直接回答了问题,而不是提供一个解决方法。if &diff 映射的想法也很棒。谢谢大家! - pabo
1
这对我不起作用。我指的不是映射,而是:cquit命令本身。Vim正确退出,但Git仍然继续进行差异化处理。 - sudokai
2
@kai https://git-scm.com/docs/git-difftool 表示您需要在 git difftool 命令中添加 --trust-exit-code。我的别名现在是 d = difftool --trust-exit-code,在添加了 --trust-exit-code 后,我可以在 vim 中使用 :cq 中止差异。 - Jon
@Jon,我和kai遇到了同样的问题。trustExitCode和--trust-exit-code都对我无效。有什么建议吗? - ftfish
@kai 我现在明白了。 difftool.trustExitCode 在较新版本的 git 中才存在,例如,在 git 1.9.1 中不可用。 - ftfish
谢谢!:D 我只是需要出去一下,因为我知道我需要重新开始,因为犯了一个错误。 - Christy

3
如果停止进程还不够,杀死启动git diff的shell本身可能更有效。请参见使用Vimdiff进行Git Diff。如果不想完全使用vimdiff(我刚开始使用它),可以将以下内容放入“gitvimdiff”中。结果是,通过运行“gitvimdiff”,我可以使用vimdiff查看git-diff,但正常调用“git diff”的行为与我习惯的相同。http://trick.vanstaveren.us/wp/wp-uploads/2009/06/close-this-window.pngVimDiff
#!/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″ “$5else
GIT_EXTERNAL_DIFF=”${0}exec git –no-pager diff “$@fi

但是,如果你仍然想要修改后的git diff,在启动之前可以使用git status命令来帮助你;)

如果需要,你可以设置一个函数来获取旧版的git diff行为:

我仍然可以通过--no-ext-diff标志访问默认的git diff行为。下面是我放在bash配置文件中的一个函数:

function git_diff() {
  git diff --no-ext-diff -w "$@" | vim -R -
}
  • --no-ext-diff:防止使用vimdiff。
  • -w:忽略空格。
  • -R:以只读模式启动vim。
  • -:使vim作为分页程序。

2

只需终止父进程。打开终端,使用pstree -p查找git进程的进程ID(PID),然后使用kill -9命令结束它。在我的系统上,它看起来像这样:

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

这并不是很优雅,但它能够工作。在您的系统上,pager 可能会有所不同,但它将具有 git 作为父进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接