การกำหนดค่าเครื่องมือ diff ด้วย. gitconfig


159

ฉันจะกำหนดค่า Git ให้ใช้เครื่องมือที่แตกต่างเพื่อกระจายกับไฟล์. gitconfig ได้อย่างไร

ฉันมีสิ่งนี้ใน. gitconfig ของฉัน:

[diff]
    tool = git-chdiff #also tried /bin/git-chdiff

มันไม่ทำงาน; มันเพิ่งเปิด diff บรรทัดคำสั่งปกติ เมื่อฉันทำ

export GIT_EXTERNAL_DIFF=git-chdiff

จากนั้นgit diffจะเปิดเครื่องมือ diffing ภายนอก (ดังนั้นฉันรู้ว่าสคริปต์เครื่องมือ diff ภายนอกทำงานได้ดี) ฉันมีสิ่งผิดปกติกับการกำหนดค่า. gitconfig ของฉันสำหรับเครื่องมือ diff หรือไม่


1
ดูstackoverflow.com/questions/255202/… (อาจปิดสิ่งนี้ซ้ำซ้อน)
Stein G. Strindhaug

คำตอบ:


140

Git เสนอช่วงของ difftools ที่กำหนดค่าไว้ล่วงหน้า "out-of-the-box" (kdiff3, kompare, tkdiff, meld, xxdiff, โผล่ออกมา, vimdiff, gvimdiff, ecmerge, opendiff, p4merge และ araxis) และยังช่วยให้คุณ เพื่อระบุของคุณเอง ในการใช้หนึ่งใน difftools ที่กำหนดไว้ล่วงหน้า (ตัวอย่างเช่น "vimdiff") คุณต้องเพิ่มบรรทัดต่อไปนี้ใน~/.gitconfig:

[diff]
    tool = vimdiff

ตอนนี้คุณจะสามารถเรียกใช้ "git difftool" และใช้เครื่องมือที่คุณเลือก

ในทางกลับกันการระบุ difftool ของคุณเองใช้เวลาทำงานเพิ่มอีกนิดดูที่ฉันจะดูเอาต์พุต 'git diff' ด้วยเครื่องมือ / ตัวแสดง diff ที่ต้องการได้อย่างไร


ลิงค์แรกเสีย ดูเหมือนว่าโดเมนที่มีการเปลี่ยนแปลงจากการ.com .orgฉันสามารถเรียกดูjeetworks.org/software
RBT

1
คุณหมายถึงอะไรโดย difftool "out-of-the-box" ที่กำหนดไว้ล่วงหน้า? ในการตั้งค่าเครื่องมือ diff ภายนอก "winMerge" ซึ่งไม่ได้อยู่ในรายการของคุณฉันต้องทำการตั้งค่าเดียวกันกับที่คุณพูดถึงในโพสต์ของคุณและทุกอย่างก็เริ่มทำงานได้โดยไม่ต้องตั้งค่าเพิ่มเติมใด ๆ นั่นหมายความว่า git รองรับ "winMerge" และออกนอกกรอบเพราะเท่าที่ฉันสามารถเข้าใจได้จากโพสต์ของคุณว่าต้องมีการทำงานพิเศษ / การตั้งค่า / การกำหนดค่าเพิ่มเติมเพื่อติดตั้งเครื่องมือ diff ซึ่งไม่ได้รับการสนับสนุน กล่องโดย git
RBT

169

วิธีเพิ่มเติมในการทำเช่นนั้น (จากบรรทัดคำสั่ง):

git config --global diff.tool tkdiff
git config --global merge.tool tkdiff
git config --global --add difftool.prompt false

สองบรรทัดแรกจะตั้งค่า difftool และ mergetool เป็นtkdiff- เปลี่ยนสิ่งนั้นตามความต้องการของคุณ บรรทัดที่สามจะปิดใช้งานพรอมต์ที่น่ารำคาญดังนั้นเมื่อใดก็ตามที่คุณกดปุ่มgit difftoolนั้นจะเป็นการเปิด difftool โดยอัตโนมัติ


11
ฉันทำgit config --global diff.tool diffmergeแต่เมื่อฉันทำgit diff myfile.txtมันก็ยังให้ฉันเริ่มต้นยูนิกซ์แตกต่างกัน
amphibient

บางทีคุณอาจมีการกำหนดค่าท้องถิ่นที่กำหนดเครื่องมือ diff อื่นได้หรือไม่
โอเมอร์ดาแกน

1
บางทีคุณต้องผ่านพารามิเตอร์ที่ถูกต้องเพื่อ diffmerge: ลิงค์นี้จะอธิบายวิธีการทำเพื่อ meld: link: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr

5
@amphibient: ลองใช้เครื่องมือ git diff myfile.txt เพื่อใช้เครื่องมือ
JBRWilkinson

72

คนอื่น ๆ ได้คำตอบ 99% สำหรับเรื่องนี้ แต่มีขั้นตอนเดียวที่เหลืออยู่ (คำตอบของฉันจะมาจาก OS X ดังนั้นคุณจะต้องเปลี่ยนพา ธ ของไฟล์ตามลำดับ)

คุณทำการเปลี่ยนแปลงเหล่านี้กับ~/.gitconfig:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /Applications/Diffmerge.app/Contents/MacOS/diffmerge $LOCAL $REMOTE

นี้จะแก้ไขเครื่องมือต่าง คุณสามารถแก้ไขได้โดยไม่ต้องแก้ไข~/.gitconfigโดยตรงโดยการป้อนคำสั่งเหล่านี้จากเทอร์มินัล:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "/Applications/DiffMerge.appContents/MacOS/diffmerge \$LOCAL \$REMOTE"

1% ที่คนอื่นล้มเหลวที่จะกล่าวถึงคือเมื่อใช้นี้คุณไม่สามารถใช้เพียงgit diff myfile.txt; git difftool myfile.txtคุณจำเป็นต้องใช้


23
โหวตขึ้นเมื่อ 1% ที่ผ่านมา ไม่มีอะไรที่น่าพอใจเท่ากับการตอกตะปูอย่างเต็มที่;)
Titou

1
มีวิธีใดที่จะทำให้เป็นเครื่องมือเริ่มต้นหรือไม่
math0ne

6
เยี่ยมมากคุณพลาดขั้นตอนgit config --global --add difftool.prompt falseไปแล้ว ;)
Suma

36

นี่คือส่วนหนึ่งของ ~ / .gitconfig ของฉันที่ฉันตั้งค่าเครื่องมือ diff และผสาน ฉันชอบความแตกต่างจาก SourceGear (ฉันชอบมันมากมากตามความเป็นจริง)

[merge]
        tool = diffmerge
[mergetool "diffmerge"]
        cmd = "diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$(if test -f \"$BASE\"; then echo \"$BASE\"; else echo \"$LOCAL\"; fi)\" \"$REMOTE\""
        trustExitCode = false
[diff]
        tool = diffmerge
[difftool "diffmerge"]
        cmd = diffmerge \"$LOCAL\" \"$REMOTE\"

ดังนั้นคุณจะเห็นว่าคุณกำลังกำหนดเครื่องมือชื่อ "diffmerge" ใน[difftool "diffmerge"]บรรทัด จากนั้นฉันกำลังตั้งค่าเครื่องมือ "diffmerge" เป็นค่าเริ่มต้นใน[diff] tool =ส่วน

เห็นได้ชัดว่าฉันมีคำสั่ง "diffmerge" ในเส้นทางของฉันที่นี่ มิฉะนั้นฉันจะต้องให้เส้นทางแบบเต็มเพื่อปฏิบัติการ


โดยไม่ต้องใช้แบ็กสแลชทั้งหมด:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-Smith

1
ฉันจะไปกับคนที่เรียบง่ายdiffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Tim Lovell-Smith

และมันก็มีสคริปต์ 'sgdm_cygwin.sh' ที่มีประโยชน์เพื่อให้รุ่น Windows ใช้งานง่ายจาก Cygwin
thoni56

ดังนั้นคุณสามารถทำได้ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergeและคุณพร้อมที่จะใช้การตั้งค่าด้านบน เช่นเดียวกับdiffmergeโดยตรงจากบรรทัดคำสั่ง cygwin ด้วยเส้นทาง cygwin
thoni56

มันจะเป็นsgdm.exeทุกวันนี้
kzu

22

ทำซ้ำคำตอบของฉันจากชุดข้อความนี้ซึ่งมีความเฉพาะเจาะจงมากขึ้นในการตั้งค่ามากกว่าการเปรียบเทียบเป็นเครื่องมือ diff สำหรับ Git รายละเอียดทั้งหมดที่ฉันแบ่งปันมีประโยชน์เท่าเทียมกันสำหรับเครื่องมือ diff ทั่วไปดังนั้นการแบ่งปันที่นี่:

คำสั่งแรกที่เราเรียกใช้มีดังนี้:

git config --global diff.tool bc3

คำสั่งดังกล่าวสร้างรายการด้านล่างที่.gitconfigพบใน%userprofile%ไดเรกทอรี:

[diff]
    tool = bc3

จากนั้นคุณเรียกใช้คำสั่งด้านล่าง (การเรียกใช้คำสั่งนี้ซ้ำซ้อนในกรณีนี้โดยเฉพาะและจำเป็นต้องใช้ในบางกรณีเท่านั้นคุณจะรู้ได้ในเวลาสั้น ๆ ):

git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"

คำสั่งด้านบนสร้างรายการด้านล่างใน.gitconfigไฟล์:

[difftool "bc3"]
    path = c:/program files/Beyond Compare 3/bcomp.exe

bc3สิ่งที่ต้องรู้ว่าที่นี่เป็นกุญแจสำคัญ นี่เป็นกุญแจสำคัญที่รู้จักกันดีในการใช้คอมไพล์กับเครื่องมือเปรียบเทียบรุ่นที่รู้จักกันดีในตลาด ( bc3ตรงกับเครื่องมือ Beyond Compare รุ่นที่ 3) หากคุณต้องการที่จะเห็นกุญแจที่กำหนดไว้ล่วงหน้าทั้งหมดเพียงแค่เรียกใช้git difftool --tool-helpคำสั่งกับทุบตี Git ส่งคืนรายการด้านล่าง:

vimdiff
vimdiff2
vimdiff3
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff

คุณสามารถใช้ปุ่มใด ๆ ข้างต้นหรือกำหนดคีย์แบบกำหนดเองของคุณเอง หากคุณต้องการตั้งค่าเครื่องมือใหม่ทั้งหมด (หรือเครื่องมือที่รู้จักกันดีรุ่นใหม่ที่ออกวางจำหน่าย) ซึ่งไม่ได้แมปกับคีย์ใด ๆ ที่ระบุไว้ข้างต้นคุณสามารถแมปกับคีย์ใด ๆ ที่ระบุไว้ด้านบนหรือใหม่รหัสที่กำหนดเองของคุณเอง

ถ้าคุณต้องตั้งค่าเครื่องมือเปรียบเทียบซึ่งก็คือ

  • ใหม่อย่างแน่นอนในตลาด

หรือ

  • รุ่นใหม่ของเครื่องมือที่รู้จักกันดีได้เปิดตัวแล้วซึ่งไม่ได้แมปกับคีย์ที่กำหนดไว้ล่วงหน้าในคอมไพล์ ?

เช่นเดียวกับในกรณีของฉันฉันได้ติดตั้งการเปรียบเทียบเกินกว่าการเปรียบเทียบ 4 เป็นเครื่องมือที่รู้จักกันดีในการคอมไพล์ แต่รุ่นที่วางจำหน่าย 4 ไม่ได้แมปกับคีย์ที่มีอยู่โดยค่าเริ่มต้น ดังนั้นคุณสามารถทำตามวิธีการด้านล่าง:

  1. ฉันสามารถแมปเกินกว่าเครื่องมือ 4 เปรียบเทียบกับคีย์ที่มีอยู่แล้วbc3ซึ่งสอดคล้องกับเกิน 3 รุ่นเปรียบเทียบ ฉันไม่ได้เปรียบเทียบรุ่น 3 บนคอมพิวเตอร์ของฉันดังนั้นฉันจึงไม่สนใจ หากฉันต้องการฉันสามารถแมปไปยังปุ่มใด ๆ ที่กำหนดไว้ล่วงหน้าในรายการด้านบนได้เช่นexamdiffกัน

    หากคุณจับคู่เครื่องมือเวอร์ชันที่รู้จักกันดีกับคีย์ที่มีอยู่แล้ว / ที่รู้จักกันดีอยู่แล้วคุณไม่จำเป็นต้องเรียกใช้คำสั่งที่สองเนื่องจากเส้นทางการติดตั้งของพวกเขารู้จัก gitแล้ว

    เช่นถ้าฉันติดตั้งนอกเหนือจากการเปรียบเทียบเวอร์ชัน 3 ในกล่องของฉันแล้วการกำหนดค่าด้านล่างใน.gitconfigไฟล์ของฉันจะเพียงพอที่จะไป:

    [diff]
    tool = bc3
    

    แต่ถ้าคุณต้องการเปลี่ยนเครื่องมือเริ่มต้นที่เกี่ยวข้องคุณต้องเอ่ยถึงpathคุณลักษณะแยกต่างหากเพื่อให้ git รู้จักเส้นทางจากที่ซึ่ง exe ใหม่ของเครื่องมือได้เปิดตัว นี่คือรายการที่สุนัขจิ้งจอกคอมไพล์ที่จะเปิดตัวเกินเปรียบเทียบ 4 แทน บันทึกเส้นทางของ exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. วิธีที่สะอาดที่สุดส่วนใหญ่คือการกำหนดคีย์ใหม่ทั้งหมดสำหรับเครื่องมือเปรียบเทียบใหม่หรือรุ่นใหม่ของเครื่องมือที่รู้จักกันดี เช่นเดียวกับในกรณีของฉันฉันกำหนดคีย์ใหม่bc4เพื่อให้จดจำได้ง่าย ในกรณีเช่นนี้คุณต้องเรียกใช้สองคำสั่งทั้งหมด แต่คำสั่งที่สองของคุณจะไม่ได้รับการตั้งค่าเส้นทางของปฏิบัติการใหม่ของเครื่องมือของคุณ แต่คุณต้องตั้งค่าcmdแอตทริบิวต์สำหรับเครื่องมือใหม่ของคุณดังที่แสดงด้านล่าง:

    git config --global diff.tool bc4
    
    git config --global difftool.bc4.cmd "\"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"\$LOCAL\" -d \"\$REMOTE\""
    

    การรันคำสั่งด้านบนจะสร้างรายการด้านล่างใน.gitconfigไฟล์ของคุณ:

    [diff]
    tool = bc4
    [difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"$LOCAL\" -d \"$REMOTE\"
    

ฉันขอแนะนำให้คุณปฏิบัติตามแนวทาง # 2 เพื่อหลีกเลี่ยงความสับสนในอนาคต


16

การเพิ่มหนึ่งในบล็อกด้านล่างนี้ทำให้ฉันใช้KDiff3สำหรับสภาพแวดล้อมการพัฒนา Windows และ Linux ของฉัน มันทำให้การกระจายข้ามแพลตฟอร์มที่สอดคล้องและเป็นเครื่องมือที่ดี

ลินุกซ์

[difftool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

ของ windows

[difftool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

คุณพบวิธีที่จะสร้างไฟล์. gitconfig ข้ามแพลตฟอร์มเดียวที่ระบุพา ธ ที่ถูกต้องตามเงื่อนไขสำหรับทั้ง linux และ windows หรือไม่?
Jerry Asher

1
สุจริตฉันได้เปลี่ยนไปรวมตัวกันทุกที่และดูเหมือนว่าจะทำงาน
moodboom

มีเหตุผลในการตั้งค่า trustExitCode = false หรือไม่ จากความเข้าใจของฉันหากตั้งค่าเป็นเท็จ git จะไม่สนใจรหัสการออกที่ไม่เป็นศูนย์จากเครื่องมือของคุณ ดังนั้นหากเครื่องมือของคุณสนใจคอมไพล์จะคิดว่าการผสานสำเร็จ แต่อาจมีเหตุผลในการตั้งค่าเป็นเท็จโปรดอธิบาย
apollo

ฉันเชื่อว่าtrustExitCode = falseจะทำให้คอมไพล์ถามคุณว่าการผสานนั้นสำเร็จหรือไม่แทนที่จะพึ่งพาว่าเครื่องมือเกิดขึ้นเพื่อออกจากสถานะจริงหรือเท็จ
moodboom

4

หากคุณต้องการมีตัวเลือกในการใช้เครื่องมือ diff หลาย ๆ อันเพิ่มนามแฝงใน. gitconfig

[alias]
    kdiff = difftool --tool kdiff3

ขึ้นสำหรับการกล่าวถึง--toolตัวเลือก ขอบคุณ
itMaxence


0

ใน Windows เราจำเป็นต้องเรียกใช้$git difftool --tool-helpคำสั่งเพื่อดูตัวเลือกต่าง ๆ เช่น:

    'git difftool --tool=<tool>' may be set to one of the following:
                    vimdiff
                    vimdiff2
                    vimdiff3

    The following tools are valid, but not currently available:
                    araxis
                    bc
                    bc3
                    codecompare
                    deltawalker
                    diffmerge
                    diffuse
                    ecmerge
                    emerge
                    examdiff
                    gvimdiff
                    gvimdiff2
                    gvimdiff3
                    kdiff3
                    kompare
                    meld
                    opendiff
                    p4merge
                    tkdiff
                    winmerge
                    xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

และเราสามารถเพิ่มใด ๆ ของพวกเขา (เช่น winmerge) เช่น

$  git difftool --tool=winmerge

สำหรับการกำหนดค่า notepad ++ ให้ดูไฟล์ก่อนคอมมิท:

 git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

และการใช้$ git commitจะเป็นการเปิดข้อมูลการส่งใน notepad ++

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