Git: Jak skonfigurować KDiff3 jako narzędzie do scalania i narzędzie do porównywania

219

Ostatnio korzystałem z GitExtension 2.46, ale wersja Git, która ma to samo, to 1.9.4.msysgit.2. Chcąc używać tylko poleceń Git, odinstalowałem GitExtension i zainstalowałem najnowszą dostępną wersję Git i KDiff3 .

Kiedy scalam i mam konflikty, uruchamiam następujące polecenie:

$ git mergetool

Następnie otrzymuję wiadomość:

Narzędzie do scalania kdiff3 nie jest dostępne jako „kdiff3”.

Myślę, że musi to być ścieżka KDiff3.

Środowisko

  • System operacyjny: Windows 10
  • Git 2.6.1. Okna 1
  • KDiff3 0.9.98 (64-bitowy)

Pytania:

  • Co muszę skonfigurować w pliku .gitconfig, aby polecenie $ git mergetoolotworzyło KDiff3 GUI w wersjach LOCAL , REMOTE , BASE i MERGED pliku będącego w konflikcie?

  • Jak skonfigurować go, aby używał narzędzia różnicowego?

Joseph
źródło

Odpowiedzi:

374

Witryny te były bardzo pomocne, prawie, Fooletool i Difftool . Użyłem konfiguracji globalnej, ale może być używana przez repozytorium bez problemów. Wystarczy wykonać następujące polecenia:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false

git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

Użycie tej trustExitCodeopcji zależy od tego, co chcesz zrobić, gdy narzędzie diff powróci. Z dokumentacji :

git-difftool wywołuje narzędzie różnicowania indywidualnie dla każdego pliku. Błędy zgłaszane przez narzędzie diff są domyślnie ignorowane. Użyj --trust-exit-code, aby polecenie git-difftool zakończyło działanie, gdy wywołane narzędzie diff zwróci niezerowy kod wyjścia.

Joseph
źródło
5
Jednak dlaczego miałbym chcieć, aby git-difftool nie wychodził, jeśli kdiff3 zawiedzie?
David Torres
9
Aby mieć rozpoznane narzędzie Visual Studio 2015, musiałem zmienić tę linię git config --global --add diff.guitool kdiff3 na następującą: git config --global --add diff.tool kdiff3
Guillaume Raymond
2
@DavidTorres Prawdopodobnie dlatego, że źle działające narzędzia Windows (które kończą się kodem niezerowym po sukcesie) niszczą je dla wszystkich.
Matthew Flaschen
2
Zgodnie z odnośnymi dokumentami ustawienie trustExitCode na false jest niepotrzebne, ponieważ domyślnie i tak jest ignorowane.
matt wilkie
7
AFAIK, --adddoda drugi lub trzeci wpis, gdy zostanie wywołany wiele razy. Trudno to później naprawić, ponieważ nie można go po prostu usunąć --remove. Samo ustawienie wartości bez --addpowinno być w porządku.
Thomas Weller,
58

Aby rozszerzyć odpowiedź @ Josepha :

Po zastosowaniu tych poleceń Twój .gitconfigplik globalny będzie miał następujące wiersze (aby przyspieszyć proces, możesz po prostu skopiować je do pliku) :

[merge]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
[diff]
    guitool = kdiff3
[difftool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
Igor Kustow
źródło
@ Alex78191, moja odpowiedź odzwierciedla odpowiedź Józefa i tam można znaleźć więcej szczegółów na temat tego ustawienia.
Igor Kustov
5
Zajęło mi dużo czasu, aby to naprawić. 2 rzeczy doprowadziły mnie na manowce: (1) .gitconfigPlik, który edytowałem, nie był tym, który był używany. Zobacz stackoverflow.com/questions/2114111/... w celu zidentyfikowania ładowanego. (2) Nie mieszaj i nie dopasowuj cmd =oraz path =w gitconfig, TL; DR: usuń cmd i po prostu użyj ścieżki
matt wilkie 26.10.17
1
Teraz na git bash użyj .... git difftool <nazwa_pliku> lub prosty git difftool, aby uruchomić właśnie ustawiony dyf gui kdiff3.
Vivek
32

Dla użytkowników komputerów Mac

Oto zaakceptowana odpowiedź @ Josepha, ale z domyślną lokalizacją ścieżki instalacji dla komputerów Mac kdiff3

(Pamiętaj, że możesz to skopiować i wkleić i uruchomić za jednym razem)

git config --global --add merge.tool kdiff3 
git config --global --add mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3" 
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false
kris
źródło
4
Nie używaj, --addponieważ może to spowodować 2 wpisy konfiguracji, jeśli uruchomisz polecenie dwukrotnie. Sprzątanie to bałagan, ponieważ nie można już usunąć pojedynczego wpisu. Zobacz git-scm.com/docs/git-config : „Do opcji można dodać wiele linii”
Thomas Weller,
11

Problem polega na tym, że Git nie może znaleźć KDiff3 w% PATH%.

W typowej instalacji Unix wszystkie pliki wykonywalne znajdują się w wielu znanych miejscach ( /bin/, /usr/bin/, /usr/local/bin/, itd), i można wywołać program po prostu wpisując jego nazwę w procesorze powłoki (np cmd.exe:)).

W systemie Microsoft Windows, programy są zazwyczaj instalowane w wydzielonych ścieżek, więc nie można po prostu wpisać kdiff3w cmdsesji i dostać KDiff3 uruchomiony.

Trudne rozwiązanie: powinieneś powiedzieć Gitowi, gdzie znaleźć KDiff3, podając pełną ścieżkę do kdiff3.exe. Niestety, Git nie lubi spacji w specyfikacji ścieżki w swojej konfiguracji, więc ostatnim razem, gdy tego potrzebowałem, skończyłem z tymi starożytnymi „C: \ Progra ~ 1 ... \ kdiff3.exe”, jakby było późno 1990s :)

Proste rozwiązanie: Edytuj ustawienia komputera i dołącz katalog z kdiff3.exe do% PATH%. Następnie sprawdź, czy możesz wywołać go z cmd.exe według jego nazwy, a następnie uruchom Git.

użytkownik3159253
źródło
8

Musiałem dodać parametry wiersza poleceń, inaczej KDiff3 otworzy się tylko bez plików i poprosi mnie o bazę, lokalną i zdalną. Użyłem wersji dostarczonej z TortoiseHg .

Dodatkowo musiałem użyć starych, dobrych nazw plików DOS 8.3.

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED

Jednak teraz działa poprawnie.

jaskółka oknówka
źródło
6

Aby zmienić Kris ' odpowiedź , zaczynając Git 2.20 (Q4 2018), właściwego dla komendy git mergetoolbędzie

git config --global merge.guitool kdiff3 

Jest tak, ponieważ „ git mergetool” nauczył się korzystać z --[no-]guiopcji „ ”, podobnie jak „ git difftool”.

Zobacz commit c217b93 , commit 57ba181 , commit 063f2bd (24 paź 2018) autor: Denton Liu ( Denton-L) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 87c15d1 , 30 października 2018)

mergetool: zaakceptuj -g/--[no-]guijako argumenty

Zgodnie z tym, jak difftoolakceptuje -g/--[no-]guiopcję, ustaw opcję mergetoolAkceptuj tę samą opcję, aby użyć merge.guitoolzmiennej do znalezienia domyślnego narzędzia do łączenia zamiast merge.tool.

VonC
źródło
5

(Próbując dowiedzieć się, jak korzystać z kdiff3 z WSL git, skończyłem tutaj i dostałem ostatnie kawałki, więc opublikuję moje rozwiązanie dla każdego, kto również natknie się tutaj, próbując znaleźć tę odpowiedź)

Jak używać kdiff3 jako narzędzia porównywania / scalania dla WSL git

Dzięki aktualizacji Windows 1903 jest to o wiele łatwiejsze; wystarczy użyć wslpath i nie ma potrzeby udostępniania TMP z Windows do WSL, ponieważ strona Windows ma teraz dostęp do systemu plików WSL poprzez \ wsl $:

[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    # Unix style paths must be converted to windows path style
    cmd = kdiff3.exe \"`wslpath -w $LOCAL`\" \"`wslpath -w $REMOTE`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false

Przed aktualizacją systemu Windows 1903

Kroki korzystania z kdiff3 zainstalowanego w systemie Windows 10 jako narzędzia porównywania / scalania git w WSL:

  1. Dodaj katalog instalacyjny kdiff3 do Ścieżki Windows.
  2. Dodaj TMP do zmiennej środowiskowej Windows WSLENV (WSLENV = TMP / up). Katalog TMP będzie używany przez git dla plików tymczasowych, podobnie jak poprzednie wersje plików, więc ścieżka musi być w systemie plików Windows, aby to działało.
  3. Ustaw TMPDIR na TMP w .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Konwertuj ścieżkę uniksową na ścieżkę systemu Windows podczas wywoływania kdiff3. Przykład mojej .gitconfig:
[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    #path = kdiff3.exe
    # Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
    cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false
Cola
źródło