Mengkonfigurasi alat berbeda dengan .gitconfig

159

Bagaimana cara mengkonfigurasi Git untuk menggunakan alat yang berbeda untuk melakukan diffing dengan file .gitconfig?

Saya memilikinya di .gitconfig saya:

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

Tidak bekerja; itu hanya membuka diff baris perintah biasa. Kapan saya melakukannya

export GIT_EXTERNAL_DIFF=git-chdiff

kemudian git diffakan membuka alat pembeda eksternal (jadi saya tahu skrip alat pembeda eksternal berfungsi dengan baik). Apakah ada yang salah dengan konfigurasi .gitconfig saya untuk alat diff?

ryanzec
sumber

Jawaban:

140

Git menawarkan serangkaian difftools yang telah dikonfigurasi "out-of-the-box" (kdiff3, kompare, tkdiff, berbaur, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, difuse, opendiff, p4merge dan araxis), dan juga memungkinkan Anda untuk menentukan milik Anda. Untuk menggunakan salah satu dari difftools yang sudah dikonfigurasi sebelumnya (misalnya, "vimdiff"), Anda menambahkan baris berikut ke ~/.gitconfig:

[diff]
    tool = vimdiff

Sekarang, Anda dapat menjalankan "git difftool" dan menggunakan alat pilihan Anda.

Di lain pihak, menentukan difftool Anda sendiri membutuhkan lebih banyak pekerjaan, lihat Bagaimana cara melihat output 'git diff' dengan alat / penampil diff pilihan saya?

Fredrik Pihl
sumber
Tautan pertama terputus. Sepertinya domain telah berubah dari .commenjadi .org. Saya dapat menjelajahi jeetworks.org/software
RBT
1
Apa yang Anda maksud dengan difftool "out-of-the-box" yang telah dikonfigurasi sebelumnya? Untuk mengatur alat diff eksternal "winMerge" yang tidak ada dalam daftar Anda, saya harus melakukan pengaturan yang sama yang telah Anda sebutkan di posting Anda dan semuanya mulai bekerja tanpa konfigurasi tambahan. Jadi apakah itu berarti bahwa git mendukung "winMerge" juga di luar kotak karena sebanyak yang saya bisa mengerti dari posting Anda bahwa itu memerlukan beberapa kerja / pengaturan / konfigurasi tambahan untuk menyiapkan alat diff yang tidak didukung di luar itu kotak dengan git.
RBT
169

Cara tambahan untuk melakukan itu (dari baris perintah):

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

Dua baris pertama akan mengatur difftool dan mergetool untuk tkdiff- mengubahnya sesuai dengan preferensi Anda. Baris ketiga menonaktifkan prompt yang mengganggu sehingga setiap kali Anda menekan git difftoolitu secara otomatis akan meluncurkan difftool.

Omer Dagan
sumber
11
Saya lakukan git config --global diff.tool diffmergetetapi ketika saya melakukannya git diff myfile.txtmasih memberi saya standar unix diff
amfibi
Mungkin Anda memiliki konfigurasi lokal yang mendefinisikan alat diff lain?
Omer Dagan
1
mungkin Anda harus lulus parameter yang benar untuk DiffMerge: link ini menjelaskan cara melakukannya untuk berbaur: link: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr
5
@amphibient: coba git alat diff myfile.txt untuk menggunakan alat ini.
JBRWilkinson
72

Yang lain telah melakukan jawaban 99% untuk ini, tetapi ada satu langkah yang tertinggal. (Jawaban saya akan datang dari OS X sehingga Anda harus mengubah jalur file yang sesuai.)

Anda membuat perubahan ini pada ~/.gitconfig:

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

Ini akan memperbaiki alat diff. Anda juga dapat memperbaiki ini tanpa mengedit ~/.gitconfigsecara langsung dengan memasukkan perintah ini dari terminal:

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

1% yang gagal disebutkan orang lain adalah ketika menggunakan ini Anda tidak bisa hanya menjalankan git diff myfile.txt; kamu harus lari git difftool myfile.txt.

tgoza
sumber
23
Terpilih untuk 1% terakhir. Tidak ada yang memuaskan seperti paku yang sepenuhnya dipalu;)
Titou
1
Apakah ada cara untuk menjadikannya alat default?
math0ne
6
Hebat, Anda kehilangan langkahnya git config --global --add difftool.prompt false. ;)
Suma
36

Inilah bagian dari ~ / .gitconfig saya tempat saya mengkonfigurasi alat diff dan merge. Saya suka diffmerge oleh SourceGear. (Saya sangat menyukainya, sebenarnya).

[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\"

Jadi, Anda lihat, Anda mendefinisikan alat bernama "diffmerge" di [difftool "diffmerge"]baris. Lalu saya mengatur alat "diffmerge" sebagai default di [diff] tool =bagian ini.

Saya jelas memiliki perintah "diffmerge" di jalur saya, di sini. Kalau tidak, aku harus memberikan jalan penuh ke executable.

Dan Ray
sumber
Tanpa semua backslash melarikan diri:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-Smith
1
Saya akan dengan yang lebih sederhanadiffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Tim Lovell-Smith
Dan itu punya skrip 'sgdm_cygwin.sh' yang berguna untuk membuat versi Windows mudah digunakan dari Cygwin.
thoni56
Jadi Anda bisa melakukannya ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergedan Anda siap untuk menggunakan konfigurasi di atas. Serta diffmergelangsung dari baris perintah cygwin dengan jalur cygwin.
thoni56
Ini akan menjadi sgdm.exesaat ini
kzu
22

Mereproduksi jawaban saya dari utas ini yang lebih spesifik untuk pengaturan di luar bandingkan sebagai alat diff untuk Git. Semua detail yang telah saya bagikan sama-sama berguna untuk semua alat pada umumnya, jadi bagikan di sini:

Perintah pertama yang kami jalankan adalah sebagai berikut:

git config --global diff.tool bc3

Perintah di atas membuat entri di bawah ini .gitconfigditemukan di %userprofile%direktori:

[diff]
    tool = bc3

Kemudian Anda menjalankan perintah di bawah ini ( Menjalankan perintah ini berlebihan dalam kasus khusus ini dan hanya diperlukan dalam beberapa kasus khusus. Anda akan mengetahuinya dalam waktu singkat ):

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

Perintah di atas membuat entri .gitconfigfile di bawah ini :

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

Yang perlu diketahui di sini adalah kuncinya bc3. Ini adalah kunci terkenal untuk git yang terkait dengan versi tertentu dari alat perbandingan terkenal yang tersedia di pasar ( bc3sesuai dengan versi ke-3 alat Beyond Compare). Jika Anda ingin melihat semua kunci yang telah ditentukan sebelumnya jalankan git difftool --tool-helpperintah pada git bash. Itu kembali di bawah daftar:

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

Anda dapat menggunakan salah satu kunci di atas atau menentukan kunci kustom Anda sendiri. Jika Anda ingin mengatur alat baru sama sekali (atau versi baru dari alat terkenal) yang tidak memetakan ke salah satu kunci yang tercantum di atas maka Anda bebas untuk memetakannya ke salah satu kunci yang tercantum di atas atau ke yang baru kunci khusus Anda sendiri.

Bagaimana jika Anda harus menyiapkan alat perbandingan yang

  • Benar-benar baru di pasaran

ATAU

  • Versi baru dari alat terkenal yang sudah ada telah dirilis dan tidak dipetakan ke kunci yang sudah ditentukan di git ?

Seperti dalam kasus saya, saya telah menginstal di luar bandingkan 4. di luar membandingkan adalah alat yang terkenal untuk git tetapi rilis versi 4 tidak dipetakan ke salah satu kunci yang ada secara default. Jadi, Anda dapat mengikuti salah satu pendekatan di bawah ini:

  1. Saya dapat memetakan di luar membandingkan 4 alat untuk kunci bc3yang sudah ada yang sesuai dengan luar membandingkan 3 versi. Saya tidak memiliki yang melebihi versi 3 di komputer saya jadi saya tidak peduli. Jika saya mau, saya bisa memetakannya ke salah satu kunci yang telah ditentukan dalam daftar di atas juga misalnya examdiff.

    Jika Anda memetakan versi alat yang dikenal ke tombol yang sudah ada / terkenal maka Anda tidak perlu menjalankan perintah kedua karena jalur instal mereka sudah dikenal untuk git .

    Untuk misalnya jika saya telah menginstal di luar membandingkan versi 3 pada kotak saya maka memiliki konfigurasi di bawah di .gitconfigfile saya sudah cukup untuk memulai:

    [diff]
    tool = bc3
    

    Tetapi jika Anda ingin mengubah alat terkait default maka Anda akhirnya menyebutkan pathatribut secara terpisah sehingga git mengetahui jalur dari mana exe alat baru Anda harus diluncurkan. Inilah entri yang diluncurkan oleh rubah git melebihi dari bandingkan 4. Perhatikan jalur exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. Pendekatan terbersih adalah mendefinisikan kunci baru sekaligus untuk alat perbandingan baru atau versi baru alat terkenal. Seperti dalam kasus saya, saya mendefinisikan kunci baru bc4sehingga mudah diingat. Dalam kasus seperti itu, Anda harus menjalankan dua perintah di semua tetapi perintah kedua Anda tidak akan menetapkan path dari executable alat baru Anda. Sebagai gantinya Anda harus mengatur cmdatribut untuk alat baru Anda seperti yang ditunjukkan di bawah ini:

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

    Menjalankan perintah di atas membuat entri di bawah ini di .gitconfigfile Anda :

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

Saya sangat menyarankan Anda untuk mengikuti pendekatan # 2 untuk menghindari kebingungan bagi diri Anda di masa depan.

RBT
sumber
16

Menambahkan salah satu blok di bawah ini berfungsi agar saya dapat menggunakan KDiff3 untuk lingkungan pengembangan Windows dan Linux saya. Itu membuat alat lintas dan penggabungan lintas platform yang bagus dan konsisten.

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
moodboom
sumber
Sudahkah Anda menemukan cara untuk membuat file .gitconfig platform lintas tunggal yang menentukan jalur yang tepat secara kondisional untuk linux dan windows?
Jerry Asher
1
Jujur, saya sudah beralih ke berbaur di mana-mana, dan sepertinya berhasil.
moodboom
Apakah ada alasan untuk menetapkan trustExitCode = false? Dari pemahaman saya jika false disetel, git akan mengabaikan kode keluar bukan nol dari alat Anda. Jadi jika alat Anda menghancurkan git akan keliru mengira penggabungan berhasil. Tetapi mungkin ada alasan untuk menyatakannya salah, mohon jelaskan.
apollo
Saya percaya trustExitCode = falseakan menyebabkan git bertanya kepada Anda apakah penggabungan berhasil, daripada mengandalkan apakah alat tersebut keluar dengan status benar atau salah.
moodboom
4

Jika Anda ingin memiliki opsi untuk menggunakan beberapa alat bantu, tambahkan alias ke .gitconfig

[alias]
    kdiff = difftool --tool kdiff3
Alexander Katz
sumber
untuk menyebutkan --toolopsi. Terima kasih
itMaxence
0

Lihat Microsoft vscode-tips-and-trik . Jalankan saja perintah-perintah ini di terminal Anda:

git config --global merge.tool code

Tapi pertama-tama Anda perlu menambahkan codeperintah ke PATH Anda. masukkan deskripsi gambar di sini

sudoz
sumber
0

Di Windows kita perlu menjalankan $git difftool --tool-helpperintah untuk melihat berbagai opsi seperti:

    '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.

dan kita dapat menambahkan salah satunya (misalnya winmerge) seperti

$  git difftool --tool=winmerge

Untuk mengonfigurasi notepad ++ untuk melihat file sebelum melakukan:

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

dan menggunakan $ git commitakan membuka informasi komit di notepad ++

Vicky yang loyal
sumber