2010-05-07 15 views
14

Tengo configuración vim como mi herramienta de diferencias externo:¿Cómo se cancela una diferencia de git externa?

[diff] 
     external = git_diff_wrapper 

#!/bin/sh 

vimdiff "$2" "$5" 

decir que tengo 300 archivos que han sido modificados; a través de bash, escribo "git diff". Lanza 300 vimdiffs secuencialmente, ¿cómo lo aborto?

+0

Este es un problema maravilloso tener :) – vfclists

Respuesta

4

Si detener el proceso no es suficiente, matar al propio shell (en el que se lanzó el git diff) podría ser más efectivo.

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


Véase también Git Diff with Vimdiff

VimDiff

No estar listo para ir a toda velocidad en el uso de vimdiff (Sólo soy nuevo a él), puse la siguiente en 'gitvimdiff'.
El resultado es que puedo usar vimdiff para mirar git-diff ejecutando 'gitvimdiff', pero una invocación normal de 'git diff' se comporta como estoy acostumbrado.

#!/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 

Pero si todavía quiere el git diff modificado, un git status podría ayudar antes de lanzarlo;)

y se puede configurar una función para obtener el comportamiento anterior git diff si es necesario:

Todavía tengo acceso al comportamiento predeterminado de diferencia de git con la bandera --no-ext-diff. Aquí hay una función que puse en mis archivos de configuración de bash:

function git_diff() { 
    git diff --no-ext-diff -w "[email protected]" | vim -R - 
} 
  • --no-ext-diff: para evitar el uso de vimdiff
  • -w: hacer caso omiso de los espacios en blanco
  • -R: para iniciar vim en sólo lectura modo
  • -: hacer que vim actúe como un buscapersonas
+0

el alias gitvimdiff es una buena idea. – v2k

+1

Oh hombre, casi habría pasado por millones de 'ctrl + q' si no hubiera leído esto primero. ¡¡Gracias una tonelada!! – shriek

2

Solo elimine el proceso principal. Abra una terminal, use pstree -p para encontrar la ID del proceso (PID) del proceso git, luego kill -9. En mi sistema, se ve algo como esto:

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

No exactamente elegante, pero funciona. En su sistema, pager probablemente será algo diferente, pero tendrá git como proceso primario.

17

Uso: cquit para salir de vim con un código de error. Git detectará el error y dejará de abrir nuevos vimdiffs.Es probable que desee para crear una asignación para que en su .vimrc:

if &diff 
    map Q :cquit<CR> 
endif 

A continuación, sólo golpeó Q para abortar temprano de una carrera git diff.

Para que esto funcione, debe editar su gitconfig:

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

Esta debería ser la respuesta aceptada, ya que aborda directamente la pregunta en lugar de proporcionar una solución alternativa. Una idea maravillosa para el mapeo 'if & diff' también. Gracias a todos! – pabo

+1

no funciona, ¿cómo configurarlo? – songhir

+0

Esto no funciona para mí. No me refiero al mapeo sino al comando: cquit en sí mismo. Vim sale correctamente pero Git todavía continúa con el proceso de difusión. – kai

Cuestiones relacionadas