Git: กำหนดค่า KDiff3 เป็นเครื่องมือผสานและเครื่องมือ diff อย่างไร


219

เมื่อเร็ว ๆ นี้ฉันใช้ GitExtension 2.46 แต่รุ่น Git ที่มีเหมือนกันคือ 1.9.4.msysgit.2 ยินดีที่จะใช้คำสั่งเพียง Git ผมถอนการติดตั้ง GitExtension และติดตั้งรุ่นล่าสุดที่มีอยู่ของGitและKDiff3

เมื่อฉันทำการผสานและมีข้อขัดแย้งฉันเรียกใช้คำสั่งต่อไปนี้:

$ git mergetool

จากนั้นฉันได้รับข้อความ:

เครื่องมือการผสาน kdiff3 ไม่สามารถใช้งานเป็น 'kdiff3'

ฉันคิดว่ามันจะต้องเป็นไปตามเส้นทาง KDiff3

สิ่งแวดล้อม

  • ระบบปฏิบัติการ: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98 (64 บิต)

คำถาม:

  • ฉันจะต้องกำหนดค่าอะไรในไฟล์. gitconfig เพื่อให้คำสั่ง$ git mergetoolเปิด KDiff3 GUI ด้วยเวอร์ชันLOCAL , REMOTE , BASEและMERGEDของไฟล์ที่ขัดแย้งกัน

  • วิธีกำหนดค่าให้ใช้งานมี diff-tool อย่างไร?


โพสต์ที่เกี่ยวข้อง - วิธีการกำหนดค่าเครื่องมือต่างใน Git ทั่วไป
RBT

คำตอบ:


376

เว็บไซต์เหล่านี้ได้อย่างเป็นประโยชน์เกือบmergetoolและdifftool ฉันใช้การกำหนดค่าส่วนกลาง แต่สามารถใช้ที่เก็บได้โดยไม่มีปัญหา คุณเพียงแค่ต้องดำเนินการคำสั่งต่อไปนี้:

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

การใช้trustExitCodeตัวเลือกขึ้นอยู่กับสิ่งที่คุณต้องการจะทำเมื่อส่งคืนเครื่องมือ diff จากเอกสาร :

git-difftoolเรียกใช้เครื่องมือต่างกันในแต่ละไฟล์ ข้อผิดพลาดที่รายงานโดยเครื่องมือ diff จะถูกละเว้นตามค่าเริ่มต้น ใช้--trust-exit-codeเพื่อสร้างgit-difftool exit เมื่อเครื่องมือ diff ที่ถูกเรียกใช้คืนค่ารหัสการออกที่ไม่เป็นศูนย์


5
ยังทำไมฉันต้อง git-difftool ไม่ออกหาก kdiff3 ล้มเหลว
David Torres

9
สำหรับฉันที่จะมีเครื่องมือ diff ที่เป็นที่รู้จักโดย Visual Studio 2015 ฉันต้องเปลี่ยนบรรทัด git config --global --add diff.guitool kdiff3 นี้เป็น: git config --global --add diff.tool kdiff3
Guillaume Raymond

2
@DavidTorres อาจเป็นเพราะเครื่องมือ Windows ที่มีพฤติกรรมไม่ดี (ออกจากด้วยรหัสที่ไม่ใช่ศูนย์ในการประสบความสำเร็จ) ทำลายมันสำหรับทุกคน
Matthew Flaschen

2
ตามเอกสารอ้างอิงการตั้งค่า trustExitCode เป็นเท็จไม่จำเป็นเนื่องจากค่าเริ่มต้นคือการเพิกเฉยต่อไป
แม

7
AFAIK --addจะเพิ่มรายการที่สองหรือสามเมื่อเรียกใช้หลายครั้ง มันยากที่จะแก้ไขในภายหลังเพราะมันไม่สามารถลบออก--removeได้ เพียงแค่ตั้งค่าโดยไม่--addควรจะตกลง
โทมัสเวลเลอ

58

เพียงเพื่อขยายคำตอบของ @ Joseph :

หลังจากใช้คำสั่งเหล่านี้.gitconfigไฟล์ทั่วโลกของคุณจะมีบรรทัดต่อไปนี้(เพื่อเร่งกระบวนการคุณสามารถคัดลอกคำสั่งเหล่านั้นในไฟล์) :

[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 คำตอบของฉันสะท้อนคำตอบของโจเซฟและคุณสามารถหารายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่านี้ได้
Igor Kustov

5
ฉันใช้เวลานานมากในการทำให้ถูกต้อง 2 สิ่งที่ทำให้ฉันหลงทาง: (1) .gitconfigไฟล์ที่ฉันแก้ไขไม่ได้เป็นไฟล์ที่ใช้งานอยู่ ดูstackoverflow.com/questions/2114111/…สำหรับการระบุอันที่กำลังโหลด (2) อย่ามิกซ์แอนด์แมทช์cmd =และpath =ใน gitconfig, TL: ลบ cmd และใช้เส้นทาง
matt wilkie

1
ตอนนี้ใช้ bash git .... gft difftool <filename> หรือ gft difftool คอมไพล์ธรรมดาเพื่อรัน diff gui kdiff3 ที่คุณเพิ่งตั้ง
Vivek

32

สำหรับผู้ใช้ Mac

นี่คือคำตอบที่ยอมรับของ @ Joseph แต่มีตำแหน่งพา ธ การติดตั้ง Mac เริ่มต้นเป็น kdiff3

(โปรดทราบว่าคุณสามารถคัดลอกและวางและเรียกใช้ในครั้งเดียว)

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
อย่าใช้--addเนื่องจากอาจส่งผลให้ 2 รายการกำหนดค่าหากคุณเรียกใช้คำสั่งสองครั้ง การทำความสะอาดเป็นระเบียบเพราะคุณไม่สามารถลบรายการเดียวได้อีก ดูgit-scm.com/docs/git-config : "สามารถเพิ่มหลายบรรทัดในตัวเลือก"
Thomas Weller

11

ปัญหาคือ Git ไม่พบ KDiff3 ใน% PATH%

ในการติดตั้งระบบปฏิบัติการยูนิกซ์ทั่วไป executables ทั้งหมดอาศัยอยู่ในหลายสถานที่ที่รู้จักกันดี ( /bin/, /usr/bin/, /usr/local/bin/ฯลฯ ) และสามารถเรียกใช้โปรแกรมโดยเพียงแค่พิมพ์ชื่อของมันในการประมวลผลเปลือก (เช่นcmd.exe:))

ใน Microsoft Windows มักจะติดตั้งโปรแกรมไว้ในพา ธ เฉพาะเพื่อให้คุณไม่สามารถพิมพ์kdiff3ในcmdเซสชันและเรียกใช้ KDiff3 ได้

วิธีการแก้ปัญหาที่ยาก: คุณควรจะบอก Git ที่จะหา KDiff3 kdiff3.exeโดยการระบุเส้นทางแบบเต็มไป น่าเสียดายที่ Git ไม่ชอบช่องว่างในสเปคพา ธ ในการตั้งค่าของมันดังนั้นครั้งสุดท้ายที่ฉันต้องการสิ่งนี้ฉันลงเอยด้วย "C: \ Progra ~ 1 ... \ kdiff3.exe" โบราณเหล่านั้น ปี 1990 :)

วิธีแก้ไขปัญหาง่าย ๆ : แก้ไขการตั้งค่าคอมพิวเตอร์ของคุณและรวมไดเรกทอรีด้วย kdiff3.exe ใน% PATH% จากนั้นทดสอบว่าคุณสามารถเรียกใช้จาก cmd.exe โดยใช้ชื่อจากนั้นเรียกใช้ Git


8

ฉันต้องการเพิ่มพารามิเตอร์บรรทัดคำสั่งหรือ KDiff3 จะเปิดโดยไม่มีไฟล์และแจ้งให้ฉันทราบสำหรับฐานท้องถิ่นและระยะไกล ผมใช้รุ่นที่มาพร้อมกับTortoiseHg

นอกจากนี้ฉันต้องหันไปใช้ชื่อไฟล์ DOS 8.3 ที่เก่าดี

[merge]
    tool = kdiff3

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

อย่างไรก็ตามมันทำงานได้อย่างถูกต้องแล้ว


6

หากต้องการแก้ไขคำตอบของkrisเริ่มต้นด้วย Git 2.20 (Q4 2018) คำสั่งที่เหมาะสมสำหรับจะเป็นgit mergetool

git config --global merge.guitool kdiff3 

นั่นเป็นเพราะ " git mergetool" เรียนรู้ที่จะใช้--[no-]guiตัวเลือกเช่นเดียวกับ " git difftool"

ดูกระทำ c217b93 , กระทำ 57ba181 , กระทำ 063f2bd (24 ตุลาคม 2018) โดยDenton หลิว (Denton-L )
(ผสานโดยJunio ​​C Hamano - gitster- in 87c15d1 , 30 Oct 2018)

mergetool: ยอมรับ-g/--[no-]guiว่าเป็นข้อโต้แย้ง

สอดคล้องกับวิธีที่difftoolยอมรับ-g/--[no-]guiตัวเลือกให้mergetoolยอมรับตัวเลือกเดียวกันเพื่อที่จะใช้merge.guitoolตัวแปรที่จะหา mergetool merge.toolเริ่มต้นแทน


5

(เมื่อพยายามหาวิธีใช้ kdiff3 จาก WSL คอมไพล์ฉันลงเอยที่นี่และได้ชิ้นสุดท้ายดังนั้นฉันจะโพสต์คำตอบของฉันสำหรับคนอื่นก็สะดุดที่นี่ในขณะที่พยายามหาคำตอบนั้น)

วิธีใช้ kdiff3 เป็นเครื่องมือ diff / merge สำหรับ WSL git

ด้วยการอัพเดท Windows 1903 มันง่ายกว่ามาก เพียงใช้ wslpath และไม่จำเป็นต้องแบ่งปัน TMP จาก Windows ไปยัง WSL เนื่องจากฝั่ง Windows ในขณะนี้สามารถเข้าถึงระบบไฟล์ WSL ผ่าน \ 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

ก่อนที่ Windows จะอัปเดต 1903

ขั้นตอนในการใช้ kdiff3 ที่ติดตั้งบน Windows 10 เป็นเครื่องมือ diff / merge สำหรับ git ใน WSL:

  1. เพิ่มไดเร็กทอรีการติดตั้ง kdiff3 ไปยังเส้นทาง Windows
  2. เพิ่ม TMP ให้กับตัวแปรสภาพแวดล้อม WSLENV Windows (WSLENV = TMP / up) TMP dir จะถูกใช้โดย git สำหรับไฟล์ชั่วคราวเช่นการแก้ไขไฟล์ก่อนหน้าดังนั้นพา ธ ต้องอยู่ในระบบไฟล์ windows เพื่อให้การทำงานนี้
  3. ตั้งค่า TMPDIR เป็น TMP ใน. bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. แปลง unix-path เป็น windows-path เมื่อเรียก kdiff3 ตัวอย่างของ. 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.