2010-12-14 16 views
8

He configurado SourceGear DiffMerge ser mi herramienta de combinación git por defecto utilizando las siguientes instrucciones:Problema con git + DiffMerge en OS X

git config --global diff.tool diffmerge 
git config --global difftool.diffmerge.cmd "diffmerge \"\$LOCAL\" \"\$REMOTE\"" 

git config --global merge.tool diffmerge 
git config --global mergetool.diffmerge.cmd "diffmerge --merge --result=\"\$MERGED\" 
\"\$LOCAL\" \"\$BASE\" \"\$REMOTE\"" 
git config --global mergetool.diffmerge.trustexitcode false 

Fuente: http://www.andrejkoelewijn.com/wp/2010/01/08/configure-diffmerge-with-git/

Sin embargo cuando corro git mergetool Me da la siguiente error:

DiffMerge Error

Cuál podría ser la causa de este problema?

+0

¿Podría tener un script de ayuda intermedia? Como en http://stackoverflow.com/questions/3780420/is-it-possible-to-use-winmerge-to-view-git-diffs-from-cygwin/4314057#4314057 – VonC

+0

, puede ejecutar el comando diffmerge en una terminal fuera de usar git? – brycemcd

+1

Veo lo mismo. El archivo BASE no existe en el sistema de archivos local, pero existen otros archivos a los que se hace referencia en la línea de comandos de diffmerge (en su caso, 10new.xml.REMOTE.2128.xml y 10new.xml.LOCAL.2128.xml). ¿Un problema con las expectativas de DiffMerge sobre el comportamiento de Git (posiblemente el comportamiento de la versión de Git)? –

Respuesta

8

Es posible que no haya ningún archivo $BASE, si, por ejemplo, los dos archivos que se combinan no tienen un antecesor común, o si se produce el conflicto cuando se aplica o rebase un parche en lugar de fusionar ramas. En este caso, aunque la variable $BASE seguirá configurada, no habrá ningún archivo allí.

En su comando mergetool, necesita comprobar si $BASE existe, y hacer una fusión sin un antecesor común si no es así. No parece que DiffMerge admita ese modo (admite fusionar dos archivos sin ancestro común, pero siempre escribe el resultado en uno de los archivos, no en un archivo de resultados). En su lugar, tendrá lugar para pasar en $LOCAL que el archivo $BASE si $BASE no existe:

git config --global mergetool.diffmerge.cmd 'diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"' 
+0

Guau increíble, parece que la única otra opción es utilizar las herramientas de combinación de Git pagas. Funciona muy bien, gracias. – Amala

+2

Awesome tip Brian! Lo he incorporado a mi configuración de Git/DiffMerge HOWTO: http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/ – ToddH

+0

@HamishGrubijan Ah, gracias. –