Git Diff com Beyond Compare


111

Consegui fazer com que o git iniciasse o Beyond Compare 3 como uma ferramenta diff, no entanto, quando faço uma diff, o arquivo que estou comparando não está sendo carregado. Apenas a versão mais recente do arquivo é carregada e nada mais, portanto, não há nada no painel direito do Beyond Compare.

Estou executando o git 1.6.3.1 com Cygwin com Beyond Compare 3. Eu configurei além da comparação, como eles sugerem na parte de suporte de seu site com um script como este:

#!/bin/sh  
# diff is called by git with 7 parameters:  
# path old-file old-hex old-mode new-file new-hex new-mode  
"path_to_bc3_executable" "$2" "$5" | cat

Alguém mais encontrou esse problema e conhece uma solução para isso?

Edit:
Segui as sugestões de VonC, mas ainda estou tendo exatamente o mesmo problema de antes. Eu sou meio novo no Git, então talvez eu não esteja usando o diff corretamente.

Por exemplo, estou tentando ver o diff em um arquivo com um comando como:
git diff main.css

O Beyond Compare será aberto e exibirá apenas meu main.css atual no painel esquerdo, não há nada no painel direito. Gostaria de ver meu main.css atual no painel esquerdo em comparação com o HEAD, basicamente o que cometi por último.

Meu git-diff-wrapper.sh se parece com isto:

#!/bin/sh  
# diff is called by git with 7 parameters:  
# path old-file old-hex old-mode new-file new-hex new-mode  
"c:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

Minha configuração git se parece com isto para Diff:

[diff]  
external = c:/cygwin/bin/git-diff-wrapper.sh

Respostas:


140

Eu não uso arquivos .sh de wrapper extras. Meu ambiente é Windows XP, git 1.7.1 no cygwin e Beyond Compare 3. A seguir está meu arquivo .git / config .

[diff]
    tool = bc3
[difftool]
    prompt = false
[difftool "bc3"]
    #use cygpath to transform cygwin path $LOCAL (something like /tmp/U5VvP1_abc) to windows path, because bc3 is a windows software
    cmd = \"c:/program files/beyond compare 3/bcomp.exe\" "$(cygpath -w $LOCAL)" "$REMOTE"
[merge]
    tool = bc3
[mergetool]
    prompt = false
[mergetool "bc3"]
    #trustExitCode = true
    cmd = \"c:/program files/beyond compare 3/bcomp.exe\" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"

Então, eu uso $ git difftool para comparar e $ git mergetool para mesclar.

Sobre trustExitCode : Para um comando de mesclagem customizado, especifique se o código de saída do comando de mesclagem pode ser usado para determinar se a mesclagem foi bem-sucedida. Se isso não for definido como verdadeiro, o carimbo de data / hora do arquivo de destino de mesclagem é verificado e a mesclagem considerada bem-sucedida se o arquivo foi atualizado; caso contrário, o usuário é solicitado a indicar o sucesso da mesclagem.


12
Estou executando no windows 7 com um shell mingw git. Tive que usar um caminho de estilo Linux em /c/program filesvez de c:/program files. Também retirei o "$(cygpath -w $LOCAL)"e apenas usei "$LOCAL". Isso pareceu funcionar.
Landon Poch

5
Como @pClass menciona abaixo, "bc3" agora é uma ferramenta interna em versões mais recentes do git. Você deve usar um nome exclusivo, como "beyondcompare3"
Scott Wegner

4
GitHub Shell (no Windows 8) me disse bcompare: command not found- até que eu mudei o NOME da ferramenta bc3para outra coisa (como abc3). Eu acho que alguma configuração interna do Github interferiu. Além disso, removi a "$(cygpath -w $LOCAL)"peça e substituí-a por "$LOCAL". Agora funciona muito bem. Obrigado!
Felix Alcala

1
Isso foi um bug para mim ao olhar para a diferença entre dois commits. Aqui está uma solução melhor: blog.kifaru.be/2011/07/…
balajimc55

2
Eu também encontrei este artigo: scootersoftware.com/support.php?zz=kb_vcs
Guy Avraham

28

Agradecimentos a @dahlbyk , autor de Posh-Git , por postar sua configuração como ponto principal . Isso me ajudou a resolver meu problema de configuração.

[diff]
    tool = bc3
[difftool]
    prompt = false
[difftool "bc3"]
    cmd = \"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = bc3
[mergetool]
    prompt = false
    keepBackup = false
[mergetool "bc3"]
    cmd = \"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"
    trustExitCode = true
[alias]
    dt = difftool
    mt = mergetool

Tentei esta resposta e não consegui diferenciar, talvez eu esteja fazendo errado.
Epu

1
@Epu você confirmou que seus caminhos são iguais na sua máquina? E é Beyond Compare 3, não um v2 antigo ou algo assim?
Nick Josevski,

Confirmei que os caminhos são os mesmos e que é bc3.
Epu

1
O engraçado é que 'git difftool file.txt' e 'git mergetool file.txt' estão funcionando bem, então mudei para eles. Mas 'git diff file.txt' agora está quebrado (antes de ser usado para me mostrar o diff padrão do console). Agora me dá 'erro: não é possível gerar bc3: arquivo ou diretório não existe \ nexterno diff morreu, parando em arquivo.txt'
Epu

Para o caso de alguém enfrentar o mesmo problema que eu (.gitconfig não reconhecido após editá-lo), tive que adicionar o caminho da seguinte maneira:cmd = 'C:\\Program Files\\Beyond Compare 4\\BCompare.exe' \"$LOCAL\" \"$REMOTE\"
sebagomez

20

Execute estes comandos para Beyond Compare 2:

git config --global diff.tool bc2
git config --global difftool.bc2.cmd "\"c:/program files (x86)/beyond compare 2/bc2.exe\" \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

Execute estes comandos para Beyond Compare 3:

git config --global diff.tool bc3
git config --global difftool.bc3.cmd "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

Então use git difftool


1
O Beyond Compare 4 é compatível?
Danijel

2
@Danijel, o documento oficial declarado nos estados de resposta de @Daniel MagnussonsNote: Use bc3 on the command line for both BC version 3 and 4
BNT


6

Aqui está meu arquivo de configuração. Demorou um pouco de luta, mas agora está funcionando. Estou usando o Windows Server, msysgit e além de comparar 3 (aparentemente uma versão x86). Você notará que não preciso especificar nenhum argumento e uso "caminho" em vez de "cmd".

[user]
        name = PeteW
        email = petew@petew.com
[diff]
        tool = bc3
[difftool]
        prompt = false
[difftool "bc3"]
        path = /c/Program Files (x86)/Beyond Compare 3/BComp.exe
[merge]
        tool = bc3
[mergetool]
        prompt = false
        keepBackup = false
[mergetool "bc3"]
        path = /c/Program Files (x86)/Beyond Compare 3/BComp.exe
        trustExitCode = true
[alias]
        dt = difftool
        mt = mergetool

4

A página de suporte do Beyond Compare é um pouco breve.

Verifique minha resposta externa diferente para mais (sobre a sintaxe exata)

Extrair:

$ git config --global diff.external <path_to_wrapper_script>

no prompt de comando, substituindo pelo caminho para " git-diff-wrapper.sh", para que ~/.gitconfigcontenha

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

Certifique-se de usar a sintaxe correta para especificar os caminhos para o script wrapper e a ferramenta diff, ou seja, use barras invertidas em vez de barras invertidas. No meu caso, eu tenho

[diff]
    external = c:/Documents and Settings/sschuber/git-diff-wrapper.sh

em .gitconfige

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

no script de wrapper.


Nota: você também pode usar git difftool.



3

Observe que você escolheu $ 2 no caminho errado. porque você está no Cygwin, mas não no BC3, então você deve especificar um caminho completo para ele. como "d: / cygwin $ 2"

Consulte meu git-diff-wrapper.sh aqui:

$ cat ~/git-diff-wrapper.sh
#!/bin/sh
echo $2
echo $5
/cygdrive/c/Program\ Files\ \(x86\)/Beyond\ Compare\ 3/BCompare.exe "d:/programs/cygwin$2" "$5"

Boa sorte.


3
Você realmente deve usar o cygpath para isso; por exemplo bcompare.exe $(cygpath -w $2). Felicidades.
Dan Molding

3

Se você estiver executando o Windows 7 (profissional) e Git para Windows (v 2.15 ou superior), você pode simplesmente executar o comando abaixo para descobrir quais são as diferentes ferramentas de diff suportadas pelo seu Git para Windows

git difftool --tool-help

Você verá uma saída semelhante a esta

git difftool --tool = 'pode ser definido como um dos seguintes:
vimdiff vimdiff2 vimdiff3

isso significa que seu git não suporta (não consigo encontrar) além da comparação como difftool agora.

Para que o Git encontre o Beyond Compare como difftool válido, você deve ter o diretório de instalação Beyond Compare na variável de ambiente do caminho do sistema . Você pode verificar isso executando bcompare do shell (cmd, git bash ou powershell. Estou usando o Git Bash). Se o Beyond Compare não iniciar, adicione seu diretório de instalação (no meu caso, C: \ Arquivos de programas \ Beyond Compare 4) à variável de caminho do sistema. Depois disso, reinicie seu shell. O Git mostrará Beyond Compare como uma opção de difftool possível. Você pode usar qualquer um dos comandos abaixo para iniciar além da comparação como difftool (por exemplo, para comparar qualquer arquivo local com algum outro ramo)

git difftool -t bc branchnametocomparewith -- path-to-file
or 
git difftool --tool=bc branchnametocomparewith -- path-to-file

Você pode configurar além da comparação como difftool padrão usando os comandos abaixo

   git config --global diff.tool bc

ps tenha em mente que bc no comando acima pode ser bc3 ou bc baseado no que o Git foi capaz de encontrar em sua variável de sistema de caminho.


2

Atualização para BC4 de 64 bits: funciona para Git para Windows v.2.16.2 e além do Compare 4 - v.4.2.4 (edição de 64 bits)

Editei manualmente o arquivo .gitconfig localizado na raiz do meu usuário "C: \ Usuários \ MeuNome_do_Usuário" e substituí as tags diff / difftool e merge / mergetool por

[diff]
  tool = bc
[difftool "bc"]
  path = 'C:/Program Files/Beyond Compare 4/BComp.exe'
[difftool "bc"]
  cmd = \"C:/Program Files/Beyond Compare 4/BComp.exe\" \"$LOCAL\" \"$REMOTE\"
[difftool]
  prompt = false
[merge]
  tool = bc
[mergetool "bc"]
  path = 'C:/Program Files/Beyond Compare 4/BComp.exe'
[mergetool "bc"]
  cmd = \"C:/Program Files/Beyond Compare 4/BComp.exe\" \"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"


1

A diferença está no exe sendo chamado: configure-o para chamar bcomp.exe e funcionará bem. Configure seu ambiente para chamar bcompare.exe e você terminará com o lado da comparação tirado de seu sistema de revisão vazio.


1

Execute estes comandos para Beyond Compare 3 (se o caminho BCompare.exe for diferente em seu sistema, substitua-o de acordo com o seu):

git config --global diff.tool bc3
git config --global difftool.bc3.cmd "\"c:/program files (x86)/beyond compare 3/BCompare.exe\" \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

Então use git difftool


1

Windows 10, Git v2.13.2

Meu .gitconfig. Lembre-se de adicionar o caractere de escape para '\' e '"'.

[diff]
    tool = bc4
[difftool]
    prompt = false
[difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\BCompare.exe\" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = bc4
[mergetool "bc4"]
    path = C:\\Program Files\\Beyond Compare 4\\BCompare.exe

Você pode referenciar a configuração além da comparação como difftool para usar comandos git para configurá-la.


Oi, eu tinha um script semelhante e ele falhou até que mudei para C: \\ Arquivos de programas \\ Beyond Compare 4 \\ BComp.exe. Com o BCompare.exe, o arquivo temporário foi excluído antes de poder ser comparado, então eu vi apenas o arquivo mais recente, nenhuma versão com check-in.
gabriel

0

Por alguma razão, para mim, o arquivo tmp criado por git diff estava sendo excluído antes de abrir além da comparação. Tive que copiá-lo para outro local primeiro.

cp -r $2 "/cygdrive/c/temp$2"
cygstart /cygdrive/c/Program\ Files\ \(x86\)/Beyond\ Compare\ 3/BCompare.exe "C:/temp$2" "$5"


0

Para git versão 2.15.1.windows.2 com BC2.exe.

A configuração abaixo finalmente funciona na minha máquina.

[difftool "bc2"] cmd = \"c:/program files/beyond compare 2/bc2.exe\" ${LOCAL} ${REMOTE}

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.