Konfigurowanie narzędzia porównywania z .gitconfig


159

Jak skonfigurować Git, aby używał innego narzędzia do porównywania z plikiem .gitconfig?

Mam to w moim .gitconfig:

[diff]
    tool = git-chdiff #also tried /bin/git-chdiff

To nie działa; po prostu otwiera zwykłe różnice w linii poleceń. Kiedy robię

export GIT_EXTERNAL_DIFF=git-chdiff

następnie git diffotworzy zewnętrzne narzędzie porównywania (więc wiem, że skrypt zewnętrznego narzędzia porównywania działa dobrze). Czy coś jest nie tak z moją konfiguracją .gitconfig dla narzędzia porównywania?


1
Zobacz stackoverflow.com/questions/255202/… (prawdopodobnie zamknij to jako duplikat)
Stein G. Strindhaug

Odpowiedzi:


140

Git oferuje szereg narzędzi difftools wstępnie skonfigurowanych „po wyjęciu z pudełka” (kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse, opendiff, p4merge i araxis), a także umożliwia określić własne. Aby użyć jednego ze wstępnie skonfigurowanych narzędzi diff (na przykład „vimdiff”), dodaj następujące wiersze do ~/.gitconfig:

[diff]
    tool = vimdiff

Teraz będziesz mógł uruchomić „git difftool” i użyć wybranego narzędzia.

Z drugiej strony, określenie własnego narzędzia difftool wymaga trochę więcej pracy, zobacz Jak wyświetlić wyjście „git diff” za pomocą mojego preferowanego narzędzia / przeglądarki porównywania?


Pierwszy link jest uszkodzony. Wygląda na to, że domena zmieniła się z .comna .org. Mogę przeglądać jeetworks.org/software
RBT,

1
Co masz na myśli, mówiąc o wstępnie skonfigurowanym narzędziu difftool „po wyjęciu z pudełka”? Aby ustawić zewnętrzne narzędzie porównujące "winMerge", którego nie ma na twojej liście, musiałem zrobić to samo, o czym wspomniałeś w swoim poście i wszystko zaczęło działać bez dodatkowej konfiguracji. Czy to oznacza, że ​​git obsługuje "winMerge" również po wyjęciu z pudełka, ponieważ o ile mogę zrozumieć z twojego posta, wymaga to dodatkowej pracy / ustawień / konfiguracji, aby ustawić narzędzie porównywania, które nie jest obsługiwane pudełko przez git.
RBT

169

Dodatkowy sposób na zrobienie tego (z linii poleceń):

git config --global diff.tool tkdiff
git config --global merge.tool tkdiff
git config --global --add difftool.prompt false

Pierwsze dwie linie ustawią difftool i connectetool na tkdiff- zmień to zgodnie z własnymi preferencjami. Trzecia linia wyłącza irytujący znak zachęty, więc po każdym git difftoolnaciśnięciu automatycznie uruchomi difftool.


11
Zrobiłem, git config --global diff.tool diffmergeale kiedy git diff myfile.txtto zrobiłem , nadal dało mi to domyślną różnicę unixową
amfibię

Być może masz lokalną konfigurację, która definiuje inne narzędzie porównywania?
Omer Dagan

1
być może musisz podać poprawne parametry, aby się rozróżnić: ten link wyjaśnia, jak to zrobić dla połączenia: link: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr

5
@amphibient: wypróbuj narzędzie git diff myfile.txt, aby użyć tego narzędzia.
JBRWilkinson

72

Inni odpowiedzieli na to w 99%, ale jeden krok został pominięty. (Moja odpowiedź będzie pochodzić z OS X, więc będziesz musiał odpowiednio zmienić ścieżki plików).

Wprowadzasz te zmiany w ~/.gitconfig:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /Applications/Diffmerge.app/Contents/MacOS/diffmerge $LOCAL $REMOTE

To naprawi narzędzie porównywania. Możesz to również naprawić bez edycji ~/.gitconfigbezpośrednio, wprowadzając następujące polecenia z terminala:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "/Applications/DiffMerge.appContents/MacOS/diffmerge \$LOCAL \$REMOTE"

1%, o którym wszyscy nie wspomnieli, to taki, którego nie można po prostu uruchomić git diff myfile.txt; musisz biec git difftool myfile.txt.


23
Głosowano za tym ostatnim 1%. Nie ma nic bardziej satysfakcjonującego jak w pełni
wbity

1
Czy istnieje sposób, aby było to narzędzie domyślne?
math0ne

6
Świetnie git config --global --add difftool.prompt false, chociaż brakuje Ci kroku . ;)
Suma

36

Oto część mojego ~ / .gitconfig, w której konfiguruję narzędzia porównywania i scalania. Lubię diffmerge od SourceGear. (Właściwie to bardzo mi się podoba).

[merge]
        tool = diffmerge
[mergetool "diffmerge"]
        cmd = "diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$(if test -f \"$BASE\"; then echo \"$BASE\"; else echo \"$LOCAL\"; fi)\" \"$REMOTE\""
        trustExitCode = false
[diff]
        tool = diffmerge
[difftool "diffmerge"]
        cmd = diffmerge \"$LOCAL\" \"$REMOTE\"

Więc widzisz, definiujesz w linii narzędzie o nazwie „diffmerge” [difftool "diffmerge"]. Następnie ustawiam narzędzie „diffmerge” jako domyślne w [diff] tool =sekcji.

Oczywiście na mojej ścieżce pojawia się polecenie „diffmerge”. W przeciwnym razie musiałbym podać pełną ścieżkę do pliku wykonywalnego.


Bez wszystkich znaków ukośnika odwrotnego:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-Smith

1
Idę z prostszymdiffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Tim Lovell-Smith

I ma poręczny skrypt 'sgdm_cygwin.sh', aby uczynić wersję Windows łatwą w użyciu od Cygwin.
thoni56

Możesz więc po prostu zrobić ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergei jesteś gotowy do użycia powyższej konfiguracji. Jak również diffmergebezpośrednio z wiersza poleceń cygwin ze ścieżkami cygwin.
thoni56

To byłoby sgdm.exeteraz
kzu

22

Reprodukuję moją odpowiedź z tego wątku, która była bardziej specyficzna dla ustawienia nieporównywalnego jako narzędzia porównywania dla Git. Wszystkie szczegóły, które udostępniłem, są równie przydatne dla każdego narzędzia porównywania w ogóle, więc udostępnij je tutaj:

Pierwsze polecenie, które uruchamiamy, jest następujące:

git config --global diff.tool bc3

Powyższe polecenie tworzy poniższy wpis w .gitconfigznalezionym w %userprofile%katalogu:

[diff]
    tool = bc3

Następnie uruchamiasz poniższe polecenie (uruchomienie tego polecenia jest w tym konkretnym przypadku zbędne i jest wymagane tylko w niektórych wyspecjalizowanych przypadkach. Dowiesz się o tym za chwilę ):

git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"

Powyższe polecenie tworzy poniższy wpis w .gitconfigpliku:

[difftool "bc3"]
    path = c:/program files/Beyond Compare 3/bcomp.exe

Najważniejsze jest to, aby wiedzieć bc3. Jest to dobrze znany klucz do gita odpowiadający konkretnej wersji dobrze znanych narzędzi porównawczych dostępnych na rynku ( bc3odpowiada trzeciej wersji narzędzia Beyond Compare). Jeśli chcesz zobaczyć wszystkie predefiniowane klawisze, po prostu uruchom git difftool --tool-helppolecenie na git bash. Wraca poniższa lista:

vimdiff
vimdiff2
vimdiff3
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff

Możesz użyć dowolnego z powyższych kluczy lub zdefiniować własny klucz niestandardowy. Jeśli chcesz skonfigurować nowe narzędzie (lub nowo wydaną wersję dobrze znanego narzędzia), które nie jest mapowane na żaden z wymienionych powyżej kluczy, możesz go zmapować na dowolny z kluczy wymienionych powyżej lub na nowy własny klucz.

Co jeśli musisz skonfigurować narzędzie porównawcze, które jest

  • Absolutnie nowy na rynku

LUB

  • Pojawiła się nowa wersja istniejącego, dobrze znanego narzędzia, która nie jest mapowana na żadne predefiniowane klucze w git ?

Podobnie jak w moim przypadku, zainstalowałem nieporównywalne 4. Poza porównaniem jest dobrze znanym narzędziem git, ale jego wersja 4 nie jest domyślnie mapowana do żadnego z istniejących kluczy. Możesz więc zastosować dowolne z poniższych podejść:

  1. Mogę zmapować narzędzie poza porównywarką 4 do już istniejącego klucza, bc3który odpowiada wersji nieporównywalnej 3. Nie miałem innej wersji 3 na moim komputerze, więc nie obchodziło mnie to. Gdybym chciał, mógłbym zmapować go do dowolnego z predefiniowanych kluczy z powyższej listy również np examdiff.

    Jeśli mapujesz dobrze znaną wersję narzędzi do odpowiedniego już istniejącego / dobrze znanego klucza, nie musisz uruchamiać drugiego polecenia, ponieważ ich ścieżka instalacji jest już znana gitowi .

    Na przykład gdybym zainstalował na moim komputerze wersję inną niż wersja 3, posiadanie poniższej konfiguracji w moim .gitconfigpliku byłoby wystarczające, aby zacząć:

    [diff]
    tool = bc3
    

    Ale jeśli chcesz zmienić domyślne powiązane narzędzie, w końcu wymieniasz pathatrybut osobno, aby git poznał ścieżkę, z której ma zostać uruchomiony plik exe nowego narzędzia. Oto wpis, który foxes git ma zamiast tego uruchomić poza porównaniem 4. Zwróć uwagę na ścieżkę exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. Najczystszym podejściem jest zdefiniowanie nowego klucza dla nowego narzędzia porównawczego lub nowej wersji dobrze znanego narzędzia. Tak jak w moim przypadku zdefiniowałem nowy klucz bc4, aby był łatwy do zapamiętania. W takim przypadku musisz uruchomić w sumie dwa polecenia, ale drugie polecenie nie będzie ustawiać ścieżki do pliku wykonywalnego twojego nowego narzędzia. Zamiast tego musisz ustawić cmdatrybut dla swojego nowego narzędzia, jak pokazano poniżej:

    git config --global diff.tool bc4
    
    git config --global difftool.bc4.cmd "\"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"\$LOCAL\" -d \"\$REMOTE\""
    

    Uruchomienie powyższych poleceń tworzy poniższe wpisy w twoim .gitconfigpliku:

    [diff]
    tool = bc4
    [difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"$LOCAL\" -d \"$REMOTE\"
    

Zdecydowanie polecam zastosować podejście nr 2, aby uniknąć zamieszania w przyszłości.


16

Dodanie jednego z poniższych bloków pomaga mi używać KDiff3 w moich środowiskach programistycznych Windows i Linux. Tworzy to ładne, spójne narzędzie do porównywania i scalania między platformami.

Linux

[difftool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

Windows

[difftool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

Czy znalazłeś sposób na utworzenie pojedynczego pliku .gitconfig dla wielu platform, który warunkowo określa prawidłowe ścieżki zarówno dla systemu Linux, jak i dla systemu Windows?
Jerry Asher

1
Szczerze mówiąc, przeszedłem na meldowanie wszędzie i wydaje się, że działa.
moodboom

Czy istnieje powód, aby ustawić trustExitCode = false? Z mojego zrozumienia, jeśli ustawione jest false, git zignorowałby niezerowy kod wyjścia z twojego narzędzia. Więc jeśli twój git zgniatający narzędzie pomyliłby się, że scalenie zakończyło się sukcesem. Być może jednak istnieje powód, dla którego należy ją fałszować, wyjaśnij.
apollo

Wierzę, trustExitCode = falseże spowoduje to, że git zapyta Cię, czy scalenie się powiodło, zamiast polegać na tym, czy narzędzie zakończyło działanie ze statusem prawda czy fałsz.
moodboom

4

Jeśli chcesz mieć możliwość korzystania z wielu narzędzi porównywania, dodaj alias do .gitconfig

[alias]
    kdiff = difftool --tool kdiff3

do wspominania --toolopcji. Dzięki
itMaxence,

0

Zobacz porady i wskazówki Microsoft vscode . Po prostu uruchom te polecenia w swoim terminalu:

git config --global merge.tool code

Ale najpierw musisz dodać codepolecenie do swojej PATH. wprowadź opis obrazu tutaj


0

W systemie Windows musimy uruchomić $git difftool --tool-helppolecenie, aby zobaczyć różne opcje, takie jak:

    'git difftool --tool=<tool>' may be set to one of the following:
                    vimdiff
                    vimdiff2
                    vimdiff3

    The following tools are valid, but not currently available:
                    araxis
                    bc
                    bc3
                    codecompare
                    deltawalker
                    diffmerge
                    diffuse
                    ecmerge
                    emerge
                    examdiff
                    gvimdiff
                    gvimdiff2
                    gvimdiff3
                    kdiff3
                    kompare
                    meld
                    opendiff
                    p4merge
                    tkdiff
                    winmerge
                    xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

i możemy dodać dowolne z nich (na przykład winmerge) jak

$  git difftool --tool=winmerge

Aby skonfigurować notepad ++, aby zobaczyć pliki przed zatwierdzeniem:

 git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

a użycie $ git commitotworzy informację o zatwierdzeniu w notatniku ++

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.