Git บน Windows: คุณตั้งค่า mergetool ได้อย่างไร


347

ฉันได้ลอง msysGit และ Git บน Cygwin แล้ว ทั้งสองทำงานได้ดีทั้งในและของตัวเองและทั้งทำงาน gitk และ git-gui อย่างสมบูรณ์แบบ

ทีนี้ฉันจะกำหนดค่า mergetool ได้อย่างไร (Vimdiff ทำงานบน Cygwin แต่โดยเฉพาะอย่างยิ่งฉันต้องการบางสิ่งบางอย่างที่ใช้งานง่ายขึ้นเล็กน้อยสำหรับเพื่อนร่วมงานที่รัก Windows ของเรา)


ดูเพิ่มเติมที่stackoverflow.com/questions/866262/p4merge-error/867165#867165
VonC

4
Git Extensions มี git UI ที่ค่อนข้างดีและเป็นมิตรกับผู้ใช้และเป็นเครื่องมือในการผสานหน้าต่าง
KallDrexx

ดูเหมือนว่าคุณต้องการ TortoiseGit?
Sergei

คำตอบ:


305

หากต้องการติดตามคำตอบของ Charles Bailey นี่คือการตั้งค่าคอมไพล์ของฉันที่ใช้p4merge (เครื่องมือผสาน 3way แบบข้ามแพลตฟอร์มฟรี); ทดสอบบน 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\""

การเปลี่ยนแปลง (สัมพันธ์กับ Charles Bailey):

  • เพิ่มไปยังการกำหนดค่า git ทั่วโลกเช่นที่ถูกต้องสำหรับโครงการ git ทั้งหมดไม่เพียง แต่ในปัจจุบัน
  • ค่าการกำหนดค่าเครื่องมือแบบกำหนดเองอยู่ใน "mergetool. [tool] .cmd" ไม่ใช่ "ผสาน [tool] .cmd" (โง่ฉันใช้เวลาหนึ่งชั่วโมงในการแก้ปัญหาว่าทำไม git จึงบ่นเกี่ยวกับเครื่องมือที่ไม่มีอยู่)
  • เพิ่มเครื่องหมายคำพูดคู่สำหรับชื่อไฟล์ทั้งหมดเพื่อให้ไฟล์ที่มีช่องว่างยังคงพบได้โดยเครื่องมือผสาน (ฉันทดสอบใน msys Git จาก Powershell)
  • โปรดทราบว่าโดยค่าเริ่มต้น Perforce จะเพิ่มการติดตั้ง dir ให้กับ PATH ดังนั้นไม่จำเป็นต้องระบุพา ธ เต็มไปยัง p4merge ในคำสั่ง

ดาวน์โหลด: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


แก้ไข (ก.พ. 2014)

ตามที่ระบุโดย@Gregory Pakosz msys gitล่าสุดตอนนี้ " ดั้งเดิม " รองรับp4merge (ทดสอบบน1.8.5.2.msysgit.0 )

คุณสามารถแสดงรายการเครื่องมือที่รองรับได้โดยเรียกใช้:

git mergetool --tool-help

คุณควรเห็นp4mergeในรายการที่ใช้ได้หรือใช้ได้ ถ้าไม่โปรดอัพเดทคอมไพล์ของคุณ

ถ้า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 ไม่แน่ใจว่าทำไม
Danny Staple

1
เข้าใจแล้ว - คำพูดเหล่านั้นดูน่าสงสัยสำหรับฉัน เพียงแค่เพิ่มขึ้นเป็นสองเท่าและพวกเขาทำงาน
Danny Staple

13
การตั้งค่าmergetool.p4merge.cmdจะไม่ทำงานอีกต่อไปตั้งแต่ Git ได้เริ่มพยายามที่จะสนับสนุน p4merge libexec/git-core/git-mergetool--libดู ใช้แทนโดยตรงmergetool.p4merge.path
Gregory Pakosz

5
ต้องใส่เส้นทางเต็มและหลบหนีคำพูดคู่:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty

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 เปรียบเทียบ 3 เช่นกัน เพียงใช้พา ธ ไปที่ BComp.exe แทน ขอบคุณ!
Richard Anthony Hein

4
ฉันรู้ว่านี่เป็นเธรดเก่า แต่ฉันไม่สามารถใช้เส้นทางนั้นได้ ฉันสับสนเล็กน้อยเกี่ยวกับวิธีที่พา ธ ควรจะรอดจากการมีส่วนร่วมของ cmd / msys ... แก้ไขการสลับเป็นอัญประกาศคู่คงที่!
Rustavore

ขอบคุณ Gitninja! โปรดทราบว่าคุณสามารถพิมพ์สิ่งนี้ลงใน Git Bash แต่ถ้าคุณใช้คำสั่งพร้อมท์คุณจะต้องเปลี่ยนเครื่องหมายคำพูดเดี่ยวเป็นเครื่องหมายคำพูดคู่
Hải Phong

61

ฉันใช้ Portable Git บน WinXP (ทำงานได้ดี!) และต้องการแก้ไขข้อขัดแย้งที่เกิดขึ้นในการแตกแขนง ในบรรดา gui ที่ฉันตรวจสอบนั้น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'"
Allen Vork

คุณรู้หรือไม่ว่ามีความแตกต่างกับลำดับที่เพิ่มแต่ละส่วน ฉันหมายความว่าถ้า [รวม] จะเป็นหลัง [mergetool]?
ซามูเอล

20

ภายใต้ Cygwin สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือ:

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
Brent Keller

6

ดูเหมือนว่าเวอร์ชั่น git ที่ใหม่กว่ารองรับ p4merge โดยตรงดังนั้น

git config --global merge.tool p4merge

ควรเป็นสิ่งที่คุณต้องการหาก p4merge.exe อยู่บนเส้นทางของคุณ ไม่จำเป็นต้องตั้งค่า cmd หรือเส้นทาง


นี่คือกุญแจสำคัญ หลังจากติดตั้ง p4merge และตั้งค่า mergetool.p4merge.path เป็นตำแหน่งที่แน่นอน แต่ก็ยังไม่สามารถใช้งานได้ การเพิ่มโฟลเดอร์การติดตั้งเข้ากับพา ธ ใช้งานได้
RichardM


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

Bah ในที่สุดมันก็ใช้ได้สำหรับฉัน (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\")

ขอบคุณโพสต์ก่อนหน้านี้สำหรับเคล็ดลับการใช้ cygpath!


3

ฉันใช้แอปที่เรียกว่าข้อมูล WinMerge ( http://winmerge.org/ ) จากคู่มือของพวกเขา ( http://manual.winmerge.org/CommandLine.html )

นี่คือสคริปต์ทุบตีที่ฉันใช้จากmergetoolคำสั่งผ่าน.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"

โดยทั่วไปแล้วทุบตีบัญชีเมื่อผลของ diff ในไฟล์ว่างเปล่าและสร้างไฟล์ temp ใหม่ในตำแหน่งที่ถูกต้อง


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 \ ชื่อผู้ใช้:

[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 เป็นเครื่องมือ diff ใน 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) การกำหนดค่า gget mergetool 3 ทางในสภาพแวดล้อม Windows ( ~/.gitconfig)

Cygwin

[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

MSYS

[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 ซึ่งฉันเพิ่งถอนการติดตั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.