Come si annulla un diff git esterno?
Domanda
Ho messa a punto vim come il mio strumento diff esterno:
[diff]
external = git_diff_wrapper
#!/bin/sh
vimdiff "$2" "$5"
dire che ho 300 file che sono stati modificati; via bash, digito "diff git". Lancia 300 vimdiffs in sequenza, come faccio abortire?
Soluzione
In caso di interruzione del processo non è sufficiente, uccidendo la shell stessa (in cui è stata lanciata la git diff
) potrebbe essere più efficace.
Vedi anche Git Diff con Vimdiff
Non essendo pronto ad andare tutta velocità nel usando
vimdiff
(io sono solo nuovi ad esso), ho messo il seguente in ‘gitvimdiff
’.
Il risultato è che posso usarevimdiff
a guardare git-diff eseguendo ‘gitvimdiff
’, ma un normale invocazione si comporta ‘git diff
’ come io sono abituato.
#!/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
Ma se si vuole ancora il git diff
modificato, un aiuto git status
potenza prima di lanciarlo;)
E si può impostare una funzione per ottenere il vecchio comportamento git diff
se necessario:
ho ancora accesso al comportamento di default diff git con la bandiera
--no-ext-diff
. Ecco una funzione che ho messo nel mio file di configurazione di bash:
function git_diff() {
git diff --no-ext-diff -w "$@" | vim -R -
}
--no-ext-diff
: per evitare usando vimdiff-w
: ignorare gli spazi-R
: per avviare vim in modalità di sola lettura-
: Affinché il vim come un cercapersone
Altri suggerimenti
Usa: cquit per uscire vim con un codice di errore. Git rileverà l'errore e fermare l'apertura di nuovi vimdiffs. Probabilmente si vorrà creare una mappatura per esso nel vostro .vimrc:
if &diff
map Q :cquit<CR>
endif
Poi basta premere Q per interrompere presto da una corsa git diff.
Al fine di questo lavoro è necessario modificare il vostro gitconfig:
git config --global difftool.trustExitCode true
git config --global mergetool.trustExitCode true
Basta uccidere il processo padre. Aprire un terminale, l'uso pstree -p
per trovare l'ID del processo (PID) del processo git
, quindi kill -9
esso. Sul mio sistema, sembra qualcosa di simile:
$ pstree -p
...
├─gnome-terminal(20473)─┬─bash(10302)───git(10331)───pager(10332)
...
$ kill -9 10331
Non esattamente elegante, ma funziona. Sul sistema, pager
sarà probabilmente qualcosa di diverso, ma avrà git
come un processo padre.