Git в Windows: Як налаштувати mergetool?


347

Я спробував msysGit та Git на Cygwin. Обидва працюють чудово і самі по собі, і обидва відмінно працюють з gitk та git-gui.

Тепер, як, до біса, налаштувати mergetool? (Vimdiff працює над Cygwin, але бажано, я хотів би щось трохи зручніше для користувачів для деяких наших колег, що люблять Windows.)



4
У Git Extensions є інтерфейс користувача git, який має досить хороший інструмент для з’єднання Windows із зручним для користувача інструментом.
KallDrexx

Схоже, вам потрібен TortoiseGit?
Сергій

Відповіді:


305

Щоб продовжити відповідь на відповідь Чарльза Бейлі, ось моя настройка git, яка використовує p4merge (безкоштовний міжплатформовий інструмент 3way merge); перевірено на встановлення msys Git (Windows):

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

або, з оболонки Windows cmd.exe, другий рядок стає:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Зміни (стосовно Чарльза Бейлі):

  • додано до глобальної конфігурації git, тобто діє для всіх git-проектів, а не лише для поточного
  • значення конфігураційного інструменту знаходиться в "mergetool. [tool] .cmd", а не "merge. [tool] .cmd" (нерозумно, я витратив годину на усунення несправностей, чому git продовжує скаржитися на неіснуючий інструмент)
  • додано подвійні лапки для всіх імен файлів, щоб файли з пробілами все ще можна було знайти інструментом злиття (я тестував це в msys Git від Powershell)
  • зауважте, що за замовчуванням Perforce додасть свій dir установки до PATH, таким чином, не потрібно вказувати повний шлях до p4merge в команді

Завантажте: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (лютий 2014 р.)

Як вказував @Gregory Pakosz , останній msys git тепер "споконвічно" підтримує p4merge (перевірено на 1.8.5.2.msysgit.0 ).

Ви можете відобразити список підтримуваних інструментів, запустивши:

git mergetool --tool-help

Ви повинні побачити p4merge у доступному чи дійсному списку. Якщо ні, то оновіть свій git.

Якщо p4merge був вказаний як доступний , він знаходиться у вашому PATH, і вам потрібно лише встановити merge.tool :

git config --global merge.tool p4merge

Якщо він був вказаний як дійсний , вам слід визначити mergetool.p4merge.path на додаток до merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Вищенаведений приклад шляху, коли p4merge був встановлений для поточного користувача, а не загальносистемний (не потрібні права адміністратора або підвищення UAC)
  • Хоча ~слід розширитись на домашній каталог поточного користувача (так теоретично повинен бути шлях ~/AppData/Local/Perforce/p4merge.exe), для мене це не спрацювало
  • Ще краще було б скористатися змінною середовища (наприклад $LOCALAPPDATA/Perforce/p4merge.exe), git, здається, не розширює змінні середовища для шляхів (якщо ви знаєте, як це зробити, будь ласка, дайте мені знати або оновіть цю відповідь)

Хм - випробування цього - перший конфігурація працює нормально, наступний лише відображає текст довідки для git config. Не знаю чому.
Danny Staple

1
Зрозумів - ці єдині цитати мені здаються підозрілими. Просто подвоїти це і вони працюють.
Danny Staple

13
налаштування mergetool.p4merge.cmdбільше не працюватиме, оскільки Git почав намагатися підтримувати p4merge, див libexec/git-core/git-mergetool--lib. замість цього він безпосередньо використовуєmergetool.p4merge.path
Григорій Пакош

5
Довелося прокласти повний шлях і уникнути подвійних цитат:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Людовик Куті

21
Це зробило це для мене: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'на машині Windows 7
Dan P.

88

встановлення mergetool.p4merge.cmd більше не працюватиме, оскільки Git почав намагатися підтримувати p4merge, див. libexec / git-core / git-mergetool--lib.so нам просто потрібно вказати шлях mergetool для git, наприклад, p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Тоді це спрацює.


1
Працює і з Beyond Compare 3. Просто використовуйте шлях до BComp.exe. Дякую!
Річард Ентоні Хайн

4
Я усвідомлюю, що це стара нитка, але я не можу отримати цей шлях до роботи. Я трохи розгублений з приводу того, як слід уникнути шляху, враховуючи взаємодію cmd / msys ... EDIT Перехід на подвійні лапки виправив це!
Руставоре

Дякую тобі Гітнінья! Зауважте, що ви можете ввести це в Git Bash, але якщо ви використовуєте команду Підказка, ви повинні змінити єдину цитату на подвійну цитату
Hải Phong

61

Я використовую Portable Git на WinXP (працює!), І мені потрібно було вирішити конфлікт, що виник у розгалуженні. З усіх перевірених вами справ , KDiff3 виявився найбільш прозорим у використанні.

Але я знайшов потрібні інструкції для роботи в Windows у цій публікації блогу , інструкції, які дещо відрізняються від інших перелічених тут підходів. В основному це було додавання цих рядків до мого .gitconfigфайлу:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Працюю чудово зараз!


13
на моєму ПК Win7 мені довелося використовувати path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(помітити подвійні косої риски)
Хтось десь

У мене з’явилася помилка на кшталт цієї "Розділення інструмента" diff "недоступне як" D: \ software \ melddiff \ Meld.exe ""
Аллен Ворк,

Чи знаєте ви, чи є різниця в порядку, де додається кожен розділ. Я маю на увазі, якщо [злиття] було б після [mergetool]?
Самуїл

20

За Цигвіна єдине , що працювало на мене, це:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

Крім того, мені подобається вимкнути повідомлення-запит для difftool:

git config --global difftool.prompt false

16

git mergetool повністю настроюється, так що ви можете майже вибрати свій улюблений інструмент.

Повна документація тут: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Якщо коротко, ви можете встановити mergetool за замовчуванням, встановивши змінну конфігурації користувача merge.tool.

Якщо інструмент злиття є одним із тих, що підтримуються ним, ви просто повинні встановити mergetool.<tool>.pathповний шлях до інструменту (замінити <tool>на те, що ви налаштували merge.tool.

В іншому випадку ви можете встановити mergetool.<tool>.cmdбіт оболонки, яку слід під час виконання виконувати, за допомогою змінних оболонок, $BASE, $LOCAL, $REMOTE, $MERGEDвстановлених у відповідних файлах. Ви повинні бути трохи обережними, коли ви редагуєте файл конфігурації чи встановлюєте змінну за допомогою git configкоманди.

Щось подібне повинно надавати аромат того, що ви можете зробити ("mymerge" - це вигаданий інструмент).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Після того, як ви налаштуєте улюблений інструмент злиття, це просто питання запуску git mergetoolкожного разу, коли у вас виникнуть конфлікти.

Інструмент p4merge від Perforce - це досить хороший окремий інструмент злиття.


8

Для порівняння в Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

2
Я використовував ці команди, але я використовую WinMerge замість Beyond Compare.
Брент Келлер

6

Здається, що новіші версії git підтримують p4merge безпосередньо, так

git config --global merge.tool p4merge

повинно бути все, що вам потрібно, якщо на вашому шляху стоїть p4merge.exe. Не потрібно встановлювати cmd або шлях.


Це ключове. Після встановлення p4merge та встановлення mergetool.p4merge.path до точного місця розташування він все ще не працював. Додавання папки інсталяції до контуру спрацювало.
RichardM

5

Як вже було сказано тут (і тут, і тут ), mergetool - це команда для налаштування цього. Для гарного графічного фронту рекомендую kdiff3 (GPL).


4

Мені довелося скинути додаткове цитування за допомогою msysGit на Windows 7, не знаю чому.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

3

Якщо ви робите це через cygwin, можливо, вам потрібно буде використовувати cygpath:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'

3

Ба, це нарешті спрацювало для мене (Windows 7 + Cygwin + TortoiseMerge):

У .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

Дякуємо попереднім плакатам за пораду використовувати цигапу!


3

Я використовую інформацію про програму під назвою WinMerge ( http://winmerge.org/ ) з їх посібника ( http://manual.winmerge.org/CommandLine.html )

це сценарій bash, який я використовую з mergetoolдирективи via.gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

в основному, bash припадає на результат, коли результат diff в порожньому файлі і створює новий тимчасовий файл у правильному місці.


3

Я знайшов два способи налаштування " SourceGear DiffMerge " як difftool та mergetool в github Windows.

Наступні команди у вікні командного рядка оновлять ваш .gitconfig для налаштування GIT з використанням DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ АБО ]

Додайте наступні рядки до своєї .gitconfig. Цей файл повинен бути у вашому домашньому каталозі на C: \ Users \ UserName:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

1

Ви також можете додати ці параметри:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

Крім того, я не знаю, чому, окрім цитування та відхилення від відповіді Мілана Гардіана накрутили мені речі.


1

Якщо хтось хоче використовувати gvim як свій інструмент різниці на TortoiseGit, то це те, що вам потрібно ввести в текстовий вхід для шляху до зовнішнього інструменту diff:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"

1

Для IntelliJ IDEA (Community Edition) тристороння конфігурація git mergetool у середовищі Windows ( ~/.gitconfig)

Сігвін

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

Місіс

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / Winpath.sh призначений для перетворення шляхів до Windows на msys і взято з питання перетворення маршруту msys на stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 


0

Якщо у вас є проблеми з відкриттям p4merge від SourceTree, знайдіть локальний файл конфігурації з назвою config під MyRepo.git та видаліть будь-яку конфігурацію злиття. У моєму випадку він намагався відкрити Meld, який я щойно видалив

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.