Git Diff с Beyond Compare

Мне удалось заставить git запустить Beyond Compare 3 в качестве инструмента сравнения, однако, когда я выполняю сравнение, файл, с которым я сравниваю, не загружается. Загружается только последняя версия файла и ничего больше, поэтому на правой панели Beyond Compare ничего нет.

Я запускаю git 1.6.3.1 с Cygwin с Beyond Compare 3. Я установил вне всякого сравнения, как они предлагают в части поддержки своего веб-сайта, с таким сценарием:

#!/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

Кто-нибудь еще сталкивался с этой проблемой и знает решение?

Изменить:
Я последовал предложениям VonC, но у меня все еще остается та же проблема, что и раньше. Я новичок в Git, поэтому, возможно, я неправильно использую diff.

Например, я пытаюсь увидеть разницу в файле с помощью такой команды:
git diff main.css

После этого откроется Beyond Compare, и на левой панели будет отображаться только мой текущий файл main.css, на правой панели ничего нет. Я хотел бы видеть мой текущий main.css на левой панели по сравнению с HEAD, в основном то, что я делал в последний раз.

Мой git-diff-wrapper.sh выглядит так:

#!/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

Моя конфигурация git для Diff выглядит так:

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

person Avanst    schedule 15.01.2010    source источник


Ответы (19)


Я не использую лишние файлы оболочки .sh. Моя среда - Windows XP, git 1.7.1 на cygwin и Beyond Compare 3. Ниже приведен мой файл .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"

Затем я использую $ git difftool для сравнения и $ git mergetool для объединения.

О trustExitCode: для настраиваемой команды слияния укажите, можно ли использовать код выхода команды слияния, чтобы определить, было ли слияние успешным. Если не установлено значение true, то проверяется временная метка целевого файла слияния, и слияние считается успешным, если файл был обновлен, в противном случае пользователю предлагается указать успешное слияние.

person yehnan    schedule 03.08.2010
comment
+1 Спасибо, работает у меня на W7 x64, cygwin, git 1.7.6.msysgit. Конечно, пришлось скорректировать путь. - person johnny; 19.08.2011
comment
@yehnan - Для чего нужен второй $ MERGED в конце командной строки слияния? - person Adrian Russell; 23.08.2011
comment
Я работаю в Windows 7 с оболочкой mingw git. Мне пришлось использовать путь в стиле linux /c/program files вместо c:/program files. Также я удалил "$(cygpath -w $LOCAL)" и просто использовал "$LOCAL". Похоже, это помогло. - person Landon Poch; 30.08.2012
comment
Как упоминает @pClass ниже, bc3 теперь является внутренним инструментом в новых версиях git. Вы должны использовать уникальное имя, например ,yondcompare3 - person Scott Wegner; 26.10.2012
comment
Оболочка GitHub (в Windows 8) сообщала мне bcompare: command not found-, пока я не изменил ИМЯ инструмента с bc3 на другое (например, abc3). Я предполагаю, что помешала какая-то внутренняя настройка Github. Кроме того, я удалил часть "$(cygpath -w $LOCAL)" и заменил ее на "$LOCAL". Теперь все работает нормально. Спасибо! - person Felix Alcala; 30.11.2012
comment
Да, не используйте bc3, имя внутреннее, поэтому cmd в gitconfig игнорируется. Cygwin git по-прежнему 1.7.9, возможно, более новые версии исправляют внутренний cmd для bc3 на что-то, что работает. - person dashesy; 09.07.2013
comment
Это было для меня ошибкой, когда я смотрел на разницу между двумя коммитами. Вот лучшее решение: blog.kifaru.be/2011/07/ - person balajimc55; 27.09.2016
comment
Я также нашел эту статью: scootersoftware.com/support.php?zz=kb_vcs - person Guy Avraham; 05.11.2016

Спасибо @dahlbyk, автору Posh-Git, за публикацию его конфигурации в качестве основной < / а>. Это помогло мне решить проблему с конфигурацией.

[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
person Nick Josevski    schedule 01.03.2012
comment
Я попробовал этот ответ и не смог определить разницу, возможно, я делаю это неправильно. - person Epu; 20.03.2012
comment
@Epu, вы подтвердили, что ваши пути совпадают на вашем компьютере? И это Beyond Compare 3, а не более старая v2 или что-то в этом роде? - person Nick Josevski; 22.03.2012
comment
Я подтвердил, что пути такие же, и что это bc3. - person Epu; 23.03.2012
comment
Забавно то, что «git difftool file.txt» и «git mergetool file.txt» работают нормально, поэтому я переключился на них. Но 'git diff file.txt' теперь заблокирован (до того, как он показывал мне консольный diff по умолчанию). Теперь это дает мне ошибку: не удается создать bc3: нет такого файла или каталога \ nexternal diff умер, остановка на file.txt ' - person Epu; 23.03.2012
comment
На всякий случай, если кто-то столкнется с той же проблемой, что и я (неопознанный .gitconfig после его редактирования), мне пришлось добавить путь следующим образом: cmd = 'C:\\Program Files\\Beyond Compare 4\\BCompare.exe' \"$LOCAL\" \"$REMOTE\" - person sebagomez; 24.08.2016
comment
кажется, новая версия git в MSWindos может использовать ${LOCAL} вместо $LOCAL в качестве переменной - person YChi Lu; 07.12.2017

Выполните эти команды для 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

Выполните эти команды для 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

Затем используйте git difftool

person user    schedule 07.06.2011
comment
Поддерживается ли Beyond Compare 4? - person Danijel; 23.01.2019
comment
@Danijel, официальный документ, указанный в ответе @Daniel Magnussons, гласит Note: Use bc3 on the command line for both BC version 3 and 4 - person BNT; 12.02.2019

У меня работала официальная документация

person Daniel Magnusson    schedule 16.05.2012
comment
Спасибо, чувак, что указал мне на официальный документ !!! по крайней мере, он указывает, какая конфигурация diff необходима для GIT против GitHub - person shridutt kothari; 09.02.2016

Вот мой файл конфигурации. Пришлось немного побороться, но теперь это работает. Я использую сервер Windows, msysgit и выше сравнения 3 (по-видимому, версию x86). Вы заметите, что мне не нужно указывать какие-либо аргументы, и я использую «путь» вместо «cmd».

[user]
        name = PeteW
        email = [email protected]
[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
person nachonachoman    schedule 10.10.2012

Страница поддержки Beyond Compare немного краткая.

Проверьте мой ответ diff.external для получения дополнительной информации (относительно точного синтаксиса)

Извлекать:

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

в командной строке, заменив путь к "git-diff-wrapper.sh", чтобы ваш ~/.gitconfig содержал

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

Обязательно используйте правильный синтаксис для указания путей к сценарию оболочки и инструменту сравнения, т.е. используйте косую черту вперед вместо обратной. В моем случае у меня

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

в .gitconfig и

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

в скрипте-оболочке.


Примечание: вы также можете использовать git difftool.

person VonC    schedule 15.01.2010

похоже, что BC3 поддерживает только 3-стороннее слияние для PRO Edition. http://www.scootersoftware.com/moreinfo.php?zz=kb_editions

person Mark Conway    schedule 19.11.2013

Обратите внимание, что вы выбрали неверный путь на 2 доллара. потому что вы находитесь под Cygwin, а BC3 - нет, поэтому вы должны указать для него полный путь. например "d: / cygwin $ 2"

Пожалуйста, обратитесь к моему git-diff-wrapper.sh здесь:

$ 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"

Удачи.

person z33    schedule 06.04.2010
comment
Вы действительно должны использовать для этого cygpath; например bcompare.exe $(cygpath -w $2). Ваше здоровье. - person Dan Moulding; 16.06.2010

Обновление для BC4 64bit: это работает для Git для Windows v.2.16.2 и Beyond Compare 4 - v.4.2.4 (64bit Edition)

Я вручную отредактировал файл .gitconfig, расположенный в моем корневом каталоге пользователя «C: \ Users \ MyUserName», и заменил теги diff / difftool и merge / mergetool на

[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\"
person mitaka    schedule 26.03.2018

Если вы используете Windows 7 (профессиональная) и Git для Windows (версия 2.15 или выше), вы можете просто запустить команду ниже, чтобы узнать, какие различные инструменты сравнения поддерживаются вашим Git для Windows.

git difftool --tool-help

Вы увидите результат, похожий на этот

git difftool --tool = 'может иметь одно из следующих значений:
vimdiff vimdiff2 vimdiff3

это означает, что ваш git не поддерживает (не может найти) вне всякого сравнения как difftool прямо сейчас.

Для того, чтобы Git мог найти вне сравнения как действительный инструмент difftool, вы должны иметь каталог установки Beyond Compare в системной переменной среды path. Вы можете проверить это, запустив bcompare из оболочки (cmd, git bash или powershell. Я использую Git Bash). Если Beyond Compare не запускается, добавьте его установочный каталог (в моем случае C: \ Program Files \ Beyond Compare 4) в переменную системного пути. После этого перезапустите оболочку. Git покажет Beyond Compare как возможную опцию difftool. Вы можете использовать любую из следующих команд для запуска без сравнения как difftool (например, для сравнения любого локального файла с какой-либо другой веткой)

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

Вы можете настроить не только для сравнения, но и по умолчанию, используя команды ниже.

   git config --global diff.tool bc

p.s. имейте в виду, что bc в приведенной выше команде может быть bc3 или bc в зависимости от того, что Git смог найти из вашей системной переменной path.

person sarabdeep singh    schedule 03.05.2018

http://rubenlaguna.com/wp/2010/08/05/visual-difftool-cygwin-git/ предлагает решение, которое я принял для работы с BeyondCompare: http://gist.github.com/564573

person Vincent Scheib    schedule 03.09.2010

Разница заключается в вызываемом exe: настройте его на вызов bcomp.exe, и он будет работать нормально. Сконфигурируйте свою среду для вызова bcompare.exe, и в конечном итоге сторона сравнения, взятая из вашей системы ревизий, будет пустой.

person rrozema    schedule 03.11.2014

Выполните следующие команды для Beyond Compare 3 (если в вашей системе путь к BCompare.exe отличается, замените его на свой):

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

Затем используйте git difftool

person Jerry Z.    schedule 07.04.2015

Windows 10, Git v2.13.2

Мой .gitconfig. Не забудьте добавить escape-символ для '\' и '"'.

[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

Вы можете сослаться на настройка вне всякого сравнения как difftool для использования команд git для его настройки.

person zhangyu12    schedule 20.12.2018
comment
Привет, у меня был похожий сценарий, и он не удался, пока я не переключился на C: \ Program Files \ Beyond Compare 4 \ BComp.exe. С помощью BCompare.exe временный файл был удален до того, как его можно было сравнить, поэтому я видел только последний файл, а не зарегистрированную версию. - person gabriel; 07.01.2020

В более поздних версиях Git и Beyond Compare, чем у OP, у меня сработало следующее:

  • Git для Windows - v.2.22.0
  • Beyond Compare 4 - v.4.2.10 (64-битная версия)

Файл конфигурации для редактирования: % USERPROFILE% \. Gitconfig

Замените теги diff / difftool и merge / mergetool на

[diff]
    tool = bc4
[difftool]
    prompt = false
[difftool "bc4"]
    cmd = \"c:/program files/beyond compare 4/bcomp.exe\" "$LOCAL" "$REMOTE"
[merge]
    tool = bc4
[mergetool]
    prompt = false
[mergetool "bc4"]
    trustExitCode = true
    cmd = \"c:/program files/beyond compare 4/bcomp.exe\" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
person Prasun Kumar Khan    schedule 09.04.2021

По какой-то причине для меня файл tmp, созданный git diff, удалялся до того, как он открылся вне всякого сравнения. Сначала мне пришлось скопировать его в другое место.

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

Для MAC после долгих исследований у меня это сработало ..! 1. Установите вне сравнения, и он будет установлен в указанном ниже месте.

/ Applications / Beyond \ Compare.app/Contents/MacOS/bcomp

Выполните следующие действия, чтобы сделать bc инструментом сравнения / слияния в git http://www.scootersoftware.com/support.php?zz=kb_mac.

person Sreedhar GS    schedule 28.11.2015

Для git версии 2.15.1.windows.2 с BC2.exe.

Конфигурация ниже наконец-то работает на моей машине.

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

person YChi Lu    schedule 06.12.2017

Работал для меня в Windows 10

Запустите в терминале git,

git config --global diff.tool bc3
git config --global difftool.bc3.path "c:/program files/beyond compare 4/bcomp.exe"
git config --global merge.tool bc3
git config --global mergetool.bc3.path "c:/program files/beyond compare 4/bcomp.exe"
person Sazzad Hissain Khan    schedule 05.05.2021