2010-12-14 15 views
8

mam skonfigurowanego SourceGear DiffMerge być domyślną git narzędzia seryjnej zgodnie z poniższymi instrukcjami:problem z git + DiffMerge na 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 

Źródło: http://www.andrejkoelewijn.com/wp/2010/01/08/configure-diffmerge-with-git/

Jednak gdy uruchamiam git mergetool otrzymuję następujący błąd:

DiffMerge Error

Co może być przyczyną tego problemu?

+0

byłoby konieczności pośredniego skryptu pomocy? Jak w http://stackoverflow.com/questions/3780420/is-it-possible-to-use-winmerge-to-view-git-diffs-from-cygwin/4314057#4314057 – VonC

+0

czy jesteś w stanie uruchomić polecenie diffmerge w terminalu poza używaniem gita? – brycemcd

+1

Widzę to samo. Plik BASE nie istnieje w lokalnym systemie plików, ale istnieją inne pliki wymienione w linii poleceń diffmerge (w twoim przypadku 10new.xml.REMOTE.2128.xml i 10new.xml.LOCAL.2128.xml). Problem z oczekiwaniami DiffMerge na zachowanie Git (być może zachowanie wersji Git)? –

Odpowiedz

8

Możliwe, że nie będzie pliku $BASE, jeśli na przykład dwa scalane pliki nie mają wspólnego przodka lub jeśli wystąpi konflikt podczas stosowania lub zmiany poprawki zamiast scalania gałęzi. W tym przypadku, gdy zmienna $BASE nadal będzie ustawiona, nie będzie tam żadnego pliku.

W poleceniu mergetool należy sprawdzić, czy istnieje $BASE i scalić bez wspólnego przodka, jeśli tak się nie dzieje. Nie wygląda na to, że DiffMerge obsługuje ten tryb (obsługuje scalanie dwóch plików bez wspólnego przodka, ale zawsze zapisuje dane wyjściowe do jednego z plików, a nie do pliku wynikowego). Zamiast tego, trzeba zamiast przejść w $LOCAL jako plik $BASE jeśli $BASE nie istnieje:

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

Wow, niesamowite, wygląda na to, że jedyną inną opcją jest użycie opłaconego merytools Git. Działa świetnie, dzięki. – Amala

+2

Awesome napiwku Brian! Włączyłem go do mojej konfiguracji Git/DiffMerge. HOWTO: http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/ – ToddH

+0

@HamishGrubijan Ah, dzięki. –