Come posso far funzionare automaticamente git git mergetool
per qualsiasi conflitto di merge? Ciò dovrebbe valere per tutte le unioni, utilizzando merge
, rebase
, pull
, eccCome faccio a fare git aprire automaticamente il mergetool se c'è un conflitto di merge?
risposta
Si può sempre usare alias
alias 'git-merge'='git merge && git mergetool'
alias 'git-rebase'='git rebase && git mergetool'
alias 'git-pull'='git pull && git mergetool'
e/o scrivere uno script di aiuto in questo senso
#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool
e poi
alias git='~/.git/git-script'
C'è nessun modo diretto di invocare mergetool, perché è solo uno dei vari modi di unire (vedi "COME RISOLVERE I CONFLITTI" in man 1 git-merge).
Come ho già detto, voglio solo chiamare 'mergetool' se c'è un conflitto. L'argomento "solo uno dei tanti modi per unire" non è convincente. Sì, ci sono molti modi, ma è abbastanza ragionevole sceglierne uno come predefinito. –
git mergetool non farà nulla se non c'è conflitto. – j13r
Stampa un messaggio. –
Per quanto ne so, non esiste un modo in porcellana per farlo.
Si può avere un wrapper git come questo (file git_mergetool.sh
, sul vostro percorso, +x
):
#!/bin/bash
SEARCH="CONFLICT"
OUTPUT=$(git "[email protected]" 2>&1 | tee /dev/tty)
if `echo ${OUTPUT} | grep -i "${SEARCH}" 1>/dev/null 2>&1`
then
git mergetool
fi
Quindi aggiungere alias:
echo alias git=\"git_mergetool.sh\" >> ~/.bashrc
Ogni volta che si richiama git, l'involucro controllerà se compare la parola "CONFLICT". Se lo fa - wrapper lancia mergetool.
Questo può essere migliorata con l'aggiunta di frase più precisa al $SEARCH
(come "merge auto non riuscito; risolvere i conflitti e quindi commettere il risultato."), Così come controllando se il primo argomento ($1
) è nella lista dei comandi risultanti in un conflitto di unione (pull
, merge
, ecc.). Altrimenti finirai per analizzare molti dati non necessari se l'output del comando git è troppo lungo.
E 'possibile senza aliasing efficacemente git? –
@QuinnStrahl È possibile denominare script 'git' (senza estensione file) e inserire il percorso prima dell'eseguibile eseguibile git. Ma è praticamente solo un altro modo di fare alias. Quindi no, non conosco un modo per ottenerlo senza fare il git alias. –
Dovrebbe essere un po 'lavorabile, ma l'espressione regolare CONFLICT necessita di miglioramenti. Penso che al momento lo raccoglierà ovunque, anche ad es. uscita diff. Almeno puoi filtrare per posizione di linea (ad esempio un'ancora), e magari espandere il testo. –
Non puoi (ancora) fare git a fare questo.
Questa soluzione potrebbe non essere accettabile.
Creare una funzione nella vostra ~/.bashrc
:
git()
{
if [[ $1 == "merge" ]] || [[ $1 == "rebase" ]] || [[ $1 == "pull" ]]; then
command git "[email protected]"
rc=$?
if [[ $rc == 1 ]]; then
echo "There are conflicts, better run git-mergetool!!!"
# There might be some other condition that returns a '1',
# if so you can add another check like this:
# if grep Conflicts $(git --git-dir)/MERGE_MSG;
command git mergetool
fi
else
command git "[email protected]"
fi
}
mergetool non viene richiamato quando si fonde:
$ git merge non_conflicting_branch
Merge made by the 'recursive' strategy.
bar | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
mergetool viene chiamata quando ci sono conflitti:
$ git merge conflicting_branch
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Automatic merge failed; fix conflicts and then commit the result.
There are Conflicts, better run git-mergetool!!!
mergetool non viene chiamato su altri errori:
$ git merge adasds
fatal: adasds - not something we can merge
Questo non sta facendo aprire git automaticamente a mergetool, questo sta facendo fare alla shell. –
Perché il downvote? Questo è essenzialmente un modo più pulito per implementare la risposta di Rosipov. – onionjake
Com'è pulito? Ti mancano alcuni tipi di conflitti (come 'git stash pop'). Poiché non filtra per comando, non è un problema. Come ti noti, il codice corrente avvierà 'git mergetool' su qualsiasi errore con 1 stato. –
- 1. Come forzare un git merge conflitto
- 2. Fusione con "git mergetool"
- 3. Git mergetool genera indesiderati file .orig
- 4. Utilizzo di ediff come git mergetool
- 5. Git mergetool con Meld su Windows
- 6. Come usare git di mergetool FileMerge
- 7. Come posso risolvere un conflitto dopo git pull?
- 8. come eseguire automaticamente l'installazione di bundle se il gemfile viene aggiornato dopo una git pull/merge?
- 9. rollback un Git merge
- 10. git merge non si unisce
- 11. Come posso fidarmi di Git merge?
- 12. Conflitto Git Merge - File remoto eliminato, file locale modificato
- 13. git rebase crea più conflitti rispetto a git merge?
- 14. Come fare un "nostro" unione usando lo strumento git merge di Eclipse?
- 15. Come risolvere automaticamente un conflitto Git prendendo la versione nel ramo attuale?
- 16. Come posso risolvere questo conflitto git?
- 17. svn merge conflitto durante commettere
- 18. Perché il tortoisemerge non funziona come il mio mergetool?
- 19. ConEmu: come faccio a fare un compito chiude automaticamente dopo il completamento
- 20. Come si usa vimdiff per risolvere un conflitto?
- 21. come fare clic automaticamente su "vuoi aprire o salvare?"
- 22. Annullare una git merge
- 23. Script per unire automaticamente 2 rami git?
- 24. gvimdiff mergetool per msysgit
- 25. Come posso forzare la visualizzazione della GUI di mergetool (kdiff3)?
- 26. Annulla "git resettare --merge"
- 27. Come fare git merge per gestire modifiche non vincolanti al mio albero di lavoro?
- 28. Git 4-way merge
- 29. Conflitto di fusione Git
- 30. Come faccio a rendere Git un file come binario?
Forse è possibile utilizzare un [githook] (http://www.kernel.org/pub/software/scm/git/docs/githooks.html), ad es. 'post-checkout' (non so se è effettivamente invocato durante un'unione.' post-merge' richiede un'unione riuscita) –
@TobiasKienzler Potresti essere su qualcosa. Se riesci a trovare una soluzione funzionante, ti darò la taglia per questa domanda. –
@QuinnStrahl Non penso che esista attualmente un hook che viene eseguito prima di ciascuno dei vari comandi che portano a un'unione, quindi [il wrapper di rospov] (http://stackoverflow.com/a/17620046/321973) è probabilmente il soluzione più semplice. Ovvero o modificando la sorgente git per implementare una funzionalità di hook di "pre-merge", nel qual caso potreste semplicemente avere git eseguire mergetool sui conflitti a seconda di un'impostazione di configurazione comunque ... –