2009-05-14 11 views
27

Sto cercando di utilizzare p4merge con git, ma sto ottenendo:errore p4merge [GIT]

Errore p4merge di partenza: "path/myFile" è (o punti a) un file non valido (questo elenca la BASE , LOCAL, REMOTE e la versione standard del file).

Git mi parla del conflitto, quindi mi chiede se voglio avviare il mergetool configurato (p4merge) e quindi ottengo l'errore sopra.

Nota aggiuntiva: succede con qualsiasi file!

Qualsiasi indizio su cosa sia e come risolverlo?

+0

Forse includi la tua sezione in .gitconfig dove configuri lo strumento di unione e il messaggio di errore completo? Hai spazi in un nome file o qualcosa del genere? – araqnid

+0

no spazi nel nome del file - ho configurato git usando questa domanda: http://stackoverflow.com/questions/426026/git-on-windows-how-do-you-set-up-a-mergetool – JohnIdol

+0

Possibile duplicato di [ git diff tmp file non valido su Windows quando si utilizza un programma esterno su Windows 7] (http://stackoverflow.com/questions/16551253/git-diff-tmp-file-invalid-on-windows-when-using-external-program- on-windows-7) – Powerslave

risposta

38

Questo ha funzionato per me usando msysgit su Windows 7:

git config --global merge.tool p4merge 
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED' 

non so perché ma il quoting cose avvitati per me .

+0

Anche in cygwin! – Ben

+0

Passato da una macchina Win 8 a un'altra, entrambi usano git bash e dovevano fare anche questo, grazie! –

+0

Non funziona su cmd.exe ma funziona su MINGW32. – Roberto

8

Si see here la mia configurazione per DiffMerge o KDiff3.

Sulla base di questo, mi sento di raccomandare per p4merge:

git config --global merge.tool merge 
git config --global mergetool.merge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"" 

e merge.sh essendo un involucro (copiato in una directory a cui fa riferimento la variabile d'ambiente PATH), in grado di prendere in considerazione il caso in cui non BASE esiste.
(quando viene creato un file in due rami differenti essendo allora fuse, non ci sarebbe alcun antenato comune per quel file)

#!/bin/sh 

# Passing the following parameters to mergetool: 
# local base remote merge_result 

alocal=$1 
base=$2 
remote=$3 
result=$4 

if [ -f $base ] 
then 
    p4merge.exe -dl "$base" "$alocal" "$remote" "$result" 
else 
    p4merge.exe -dl "$result" "$alocal" "$remote" "$result" 
fi 

Si può notare:

  • l'uso del PWD nella configurazione della fusione
  • l'uso di "merge" come nome del nome merge.tool (poiché lo strumento effettivo viene chiamato nello script merge.sh, in cui è possibile passare da un qualsiasi numero di strumento di unione desiderato)
  • l'uso di doppi apici intorno $base, $alocal, $remote, $result all'interno dello script
  • il percorso condizionale per chiamare lo strumento, basato sull'esistenza di un file "base".
  • la necessità di avere sempre 3 file per unire come parametri (anche se 'base' non esiste ...)

appena provato (a quanto pare, è possibile download and install only p4merge - sezione Client/Visual Merge Tool -, anche se non sono installati altri prodotti P4).

Con le impostazioni descritto sopra, MSysGit1.6.3, sessione DOS o sessione di bash Git:
Funziona proprio TM.


Aggiornamento msysgit 1.7.x

Benjol menzioni nei commenti:

p4merge is now supported natively by msysgit.

This means you can just do:

git config --global merge.tool p4merge 
# and I recommend 
git config --global mergetool.keepBackup false 
+0

suona bene - Gli darò un colpo al più presto e ti faccio sapere! – JohnIdol

+0

Hai "merge.sh due volte nella seconda riga del tuo primo blocco di codice, ma con quello corretto, tutto funziona. Grazie! – Benjol

+0

@Benjol grazie. Ho corretto l'errore – VonC