2013-05-11 20 views
37

Właśnie zaczynam pracować z Git. Chciałbym użyć TortoiseMerge jako difftool i mergetool.Czy TortoiseMerge może być używany jako difftool z Windows Git Bash?

W moim pliku .gtconfig w moim osobistym katalogu użytkownika mam następujące sekcje. Usunąłem sekcje użytkownika i kolorów dla tego pytania.

[merge] 
    tool = tortoisemerge 
[mergetool "tortoisemerge"] 
    cmd = \"TortoiseMerge.exe\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\" 
[diff] 
    tool = tortoisemerge 
[difftool "tortoisemerge"] 
    cmd = \"TortoiseMerge.exe\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\" 

Jeśli napiszę tortoisemerge po znaku zachęty Git Bash, zostanie załadowany. Wiadomo, że jest na ścieżce. Ale jeśli wpiszę komendę, otrzymam następujący błąd.

Rich:mygittest (master *) 
$ git difftool 
error: 'tortoisemerge' can only be used to resolve merges 
merge tool candidates: kompare emerge vimdiff 
No known merge resolution program available. 
external diff died, stopping at readme.txt. 
Rich:mygittest (master *) 
$ 

Czego nie rozumiem, aby to zadziałało? Tortoisemerge jest instalowany z TortoiseSVN.

Odpowiedz

57

Poniższe ustawienia działają dobrze dla mnie. Jednak używam TortoiseGit, a nie TortoiseSVN. Zauważ różnicę w parametrach diff.

[diff] 
    tool = tortoisediff 
[difftool] 
    prompt = false 
[merge] 
    tool = tortoisemerge 
[mergetool] 
    prompt = false 
    keepBackup = false 
[difftool "tortoisediff"] 
    cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -mine "$REMOTE" -base "$LOCAL" 
[mergetool "tortoisemerge"] 
    cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$REMOTE" -mine "$LOCAL" -merged "$MERGED" 
+2

TortoiseMerge ma problem ze sposobem Git mangles parametrów. Ponieważ TortoiseMerge używa dwukropka do oddzielenia nazwy parametru od wartości, Git umieszcza cytaty wokół obu przy nazwach plików ze spacjami. TortoiseGitMerge pozwala na przestrzeń i łagodzi problem. –

+0

To jest bash msys, który mangles cytuje. Najwyraźniej powinna działać z git tortoise 1.8 – jwg

+0

[Perforce nie może poradzić sobie z dwukropkami] (http://stackoverflow.com/a/12638596/284795). Powinniśmy poprosić TortoiseMerge o dodanie alternatywnej składni. –

6

Tak, że nazwy plików ze spacjami są obsługiwane poprawnie, należy zmienić ostatnią linię odpowiedź @ Melbourn do

cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$REMOTE" -mine "$LOCAL" -merged "$MERGED" 
+0

Jaka jest różnica? Czy to (właśnie), że dwukropki w parametrach zostały zastąpione spacjami? Czy podobną zmianę należy wprowadzić dla difftoolu? Nie wiem, czy warto edytować oryginalną odpowiedź, czy też jest jakiś powód dla dwukropków .. – mwfearnley

+0

Dwukropki zastępowane są spacjami. Kod obsługi argumentów może akceptować dwukropki lub spacje. Jednak cytowania wokół nazwy pliku, która zawiera spacje, nie będą obsługiwane poprawnie, jeśli cudzysłowy nie znajdują się ani na początku, ani na końcu "słów". – jwg

+2

@jwg Zmodyfikowaliśmy teraz moją odpowiedź, aby uwzględnić Twoją opinię. Dzięki! –

0

Świetna odpowiedź! Zaoszczędził mi dużo czasu. Jednym z niedociągnięć jest to, że nowo dodane lub usunięte pliki z repozytorium nie pojawią się podczas wykonywania komendy difftool. Oto co zrobiłem: (Zainspirowany przez mojego współpracownika answer).

  1. Utwórz plik o nazwie empty.empty w katalogu $Home (C:/home). I jak sugeruje nazwa, niech będzie puste.
  2. Utwórz inny plik o nazwie tortoisediff.sh w $Home/bin katalogu (C:/home/bin) o następującej treści

:

#!/bin/sh 
# $LOCAL $REMOTE seem to be swapped 
# $1 is $LOCAL 
# $2 is $REMOTE 

difftool='/c/Program Files/TortoiseGit/bin/TortoiseGitMerge.exe' 
NULL="/dev/null" 
empty="C:/home/empty.empty" 

if [ "$1" == "$NULL" ]; then 
    echo "Added: " "$2" 
    "$difftool" /base:"$empty" /mine:"$2" /readonly:"$empty" 
elif [ "$2" == "$NULL" ]; then 
    echo 'Removed: ' "$1" 
    "$difftool" /base:"$1" /readonly:"$1" /mine:"$empty" 
else 
    echo 'Modified' "$2" 
    "$difftool" /base:"$1" /basename:"$1" /readonly:"$1" /mine:"$2" /minename:"$2" 
fi 

# Checkout https://tortoisegit.org/docs/tortoisegitmerge/tme-automation.html for more 
  1. Modyfikowanie .gitconfig file (linia 11 odpowiedzi)

    cmd = tortoisediff.sh "$LOCAL" "$REMOTE"

To sprawi, że difftool będzie teraz odwoływał się do tortoisediff.sh zamiast bezpośrednio otwierać aplikację.

  1. Pamiętaj: trzeba by uruchomić git add . następnie git difftool --staged zamiast po prostu git difftool.