Git: Como configurar o KDiff3 como ferramenta de mesclagem e ferramenta diff


218

Recentemente eu estava usando o GitExtension 2.46, mas a versão do Git que tem o mesmo é 1.9.4.msysgit.2. Disposto a usar apenas os comandos do Git, desinstalei o GitExtension e instalei a versão mais recente disponível do Git e do KDiff3 .

Quando faço uma mesclagem e tenho conflitos, executo o seguinte comando:

$ git mergetool

Então eu recebo a mensagem:

A ferramenta de mesclagem kdiff3 não está disponível como 'kdiff3'.

Eu acho que deve ser pelo caminho do KDiff3.

Meio Ambiente

  • SO: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98 (64 bits)

Questões:

  • O que tenho que configurar no arquivo .gitconfig para o comando $ git mergetoolabrir a GUI do KDiff3 com as versões LOCAL , REMOTE , BASE e MERGED do arquivo em conflito?

  • Como configurá-lo para usá-lo possui uma ferramenta diff?


Respostas:


373

Estes sites foram muito úteis, quase, mergetool e difftool . Eu usei a configuração global, mas pode ser usada pelo repositório sem problemas. Você só precisa executar os seguintes comandos:

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

O uso da trustExitCodeopção depende do que você deseja fazer quando a ferramenta diff retornar. Da documentação :

O git-difftool chama uma ferramenta diff individualmente em cada arquivo. Os erros relatados pela ferramenta diff são ignorados por padrão. Use --trust-exit-code para fazer o git-difftool sair quando uma ferramenta diff chamada retornar um código de saída diferente de zero.


5
Ainda assim, por que eu gostaria que o git-difftool não saia se o kdiff3 falhar?
David Torres

9
Para mim ter a ferramenta de comparação reconhecido pelo Visual Studio 2015, eu tive que mudar esta linha git config --global --add diff.guitool kdiff3 para o seguinte: git config --global --add diff.tool kdiff3
Guillaume Raymond

2
@DavidTorres Provavelmente porque as ferramentas do Windows que se comportam mal (que saem com códigos diferentes de zero em caso de sucesso) arruinam isso para todos.
Matthew Flaschen

2
De acordo com os documentos referenciados, definir trustExitCode como false é desnecessário, pois o padrão é ignorá-lo de qualquer maneira.
Matt Wilkie

7
AFAIK, --addadicionará uma segunda ou terceira entrada quando chamada várias vezes. Isso é difícil de corrigir mais tarde, porque não pode simplesmente ser removido com --remove. Apenas definir um valor sem --adddeve estar ok.
18716 Thomas Weller #

58

Apenas para estender a resposta de @ Joseph :

Depois de aplicar esses comandos, seu .gitconfigarquivo global terá as seguintes linhas (para acelerar o processo, basta copiá-los no arquivo) :

[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

@ Alex78191, minha resposta reflete a resposta de Joseph e você pode encontrar mais detalhes sobre essa configuração.
Igor Kustov

5
Levei muito tempo para acertar. Duas coisas me desencaminharam: (1) O .gitconfigarquivo que eu estava editando não era o que estava sendo usado. Consulte stackoverflow.com/questions/2114111/… para identificar os que estão sendo carregados. (2) Não misturar e combinar cmd =e path =em gitconfig, TL; DR: cmd exclusão e caminho uso apenas
Matt Wilkie

1
Agora, no git bash, use .... git difftool <nome do arquivo> ou git difftool simples para executar o diff gui kdiff3 que você acabou de definir.
Vivek

32

Para usuários de Mac

Aqui está a resposta aceita de @ Joseph, mas com o local padrão do caminho de instalação do Mac, kdiff3

(Observe que você pode copiar e colar isso e executá-lo de uma só vez)

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

4
Não use, --addpois isso pode resultar em 2 entradas de configuração se você executar o comando duas vezes. É uma bagunça limpando isso, porque você não pode mais excluir uma única entrada. Veja git-scm.com/docs/git-config : "Várias linhas podem ser adicionadas a uma opção"
Thomas Weller

11

Bem, o problema é que o Git não consegue encontrar o KDiff3 no% PATH%.

Em uma instalação típica Unix todos os executáveis residem em vários locais conhecidos ( /bin/, /usr/bin/, /usr/local/bin/, etc.), e pode-se chamar o programa, basta digitar o seu nome em um processador de shell (por exemplo cmd.exe:)).

No Microsoft Windows, os programas geralmente são instalados em caminhos dedicados, assim você não pode simplesmente digitar kdiff3uma cmdsessão e executar o KDiff3.

A solução mais difícil: você deve informar ao Git onde encontrar o KDiff3 especificando o caminho completo para kdiff3.exe. Infelizmente, o Git não gosta de espaços na especificação do caminho em sua configuração; portanto, na última vez em que precisei disso, acabei com os antigos "C: \ Progra ~ 1 ... \ kdiff3.exe" como se fosse tarde 1990s :)

A solução simples: edite as configurações do computador e inclua o diretório com kdiff3.exe em% PATH%. Em seguida, teste se você pode invocá-lo do cmd.exe pelo nome e execute o Git.


8

Eu precisava adicionar os parâmetros da linha de comando ou o KDiff3 abriria apenas sem arquivos e solicitaria a base, local e remoto. Eu usei a versão fornecida com o TortoiseHg .

Além disso, eu precisava recorrer aos bons e antigos nomes de arquivos do DOS 8.3.

[merge]
    tool = kdiff3

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

No entanto, ele funciona corretamente agora.


6

Para alterar a resposta de kris , começando com Git 2.20 (quarto trimestre de 2018), o comando apropriado serágit mergetool

git config --global merge.guitool kdiff3 

Isso porque " git mergetool" aprendeu a usar a --[no-]guiopção " ", assim como " git difftool" faz.

Consulte commit c217b93 , commit 57ba181 , commit 063f2bd (24 de outubro de 2018) por Denton Liu ( Denton-L) .
(Mesclado por Junio ​​C Hamano - gitster- no commit 87c15d1 , 30 de outubro de 2018)

mergetool: aceitar -g/--[no-]guicomo argumentos

De acordo com como difftoolaceita uma -g/--[no-]guiopção, mergetoolaceite a mesma opção para usar a merge.guitoolvariável para encontrar a ferramenta de fusão padrão em vez de merge.tool.


5

(Ao tentar descobrir como usar o kdiff3 do WSL git, acabei aqui e recebi as peças finais, por isso vou postar minha solução para qualquer um que tropeçar aqui enquanto tenta encontrar a resposta)

Como usar o kdiff3 como ferramenta diff / merge para o WSL git

Com a atualização 1903 do Windows, é muito mais fácil; basta usar wslpath e não há necessidade de compartilhar o TMP do Windows para o WSL, já que o lado do Windows agora tem acesso ao sistema de arquivos WSL via \ 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

Antes da atualização do Windows 1903

Etapas para usar o kdiff3 instalado no Windows 10 como ferramenta diff / merge para git na WSL:

  1. Adicione o diretório de instalação do kdiff3 ao Caminho do Windows.
  2. Adicione TMP à variável de ambiente WSLENV Windows (WSLENV = TMP / up). O diretório TMP será usado pelo git para arquivos temporários, como revisões anteriores de arquivos, portanto, o caminho deve estar no sistema de arquivos do Windows para que isso funcione.
  3. Defina TMPDIR como TMP em .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Converta o caminho unix em caminho do Windows ao chamar o kdiff3. Exemplo do meu .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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.