Git: Bagaimana mengkonfigurasi KDiff3 sebagai alat gabungan dan alat diff


218

Baru-baru ini saya menggunakan GitExtension 2.46, tetapi versi Git yang sama adalah 1.9.4.msysgit.2. Karena hanya ingin menggunakan perintah Git, saya menghapus GitExtension dan menginstal versi terbaru yang tersedia dari Git dan KDiff3 .

Ketika saya membuat penggabungan dan memiliki konflik, saya menjalankan perintah berikut:

$ git mergetool

Lalu saya menerima pesan:

Alat gabungan kdiff3 tidak tersedia sebagai 'kdiff3'.

Saya kira itu harus melalui jalur KDiff3.

Lingkungan Hidup

  • OS: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98 (64 bit)

Pertanyaan:

  • Apa yang harus saya konfigurasikan dalam file .gitconfig agar perintah $ git mergetooluntuk membuka GUI KDiff3 dengan versi LOCAL , REMOTE , BASE , dan MERGED dari file yang konflik?

  • Bagaimana mengkonfigurasinya untuk menggunakannya memiliki alat yang berbeda?


Jawaban:


373

Situs-situs ini sangat membantu, hampir, mergetool dan difftool . Saya menggunakan konfigurasi global, tetapi dapat digunakan oleh repositori tanpa masalah. Anda hanya perlu menjalankan perintah berikut:

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

Penggunaan trustExitCodeopsi tergantung pada apa yang ingin Anda lakukan ketika alat berbeda kembali. Dari dokumentasi :

git-difftool memanggil alat diff secara individual pada setiap file. Kesalahan yang dilaporkan oleh alat diff diabaikan secara default. Gunakan --trust-exit-code untuk membuat git-difftool keluar ketika alat diff yang dipanggil mengembalikan kode keluar yang tidak nol.


5
Namun, mengapa saya ingin git-difftool tidak keluar jika kdiff3 gagal?
David Torres

9
Bagi saya untuk memiliki alat diff yang diakui oleh Visual Studio 2015, saya harus mengubah baris git config --global --add diff.guitool kdiff3 ini menjadi ini: git config --global --add diff.tool kdiff3
Guillaume Raymond

2
@ Davidvidor Mungkin karena berperilaku buruk alat Windows (yang keluar dengan kode tidak nol pada keberhasilan) merusaknya untuk semua orang.
Matthew Flaschen

2
Menurut dokumen yang direferensikan, setting trustExitCode ke false tidak perlu, karena standarnya adalah mengabaikannya.
matt wilkie

7
AFAIK, --addakan menambahkan entri kedua atau ketiga ketika dipanggil beberapa kali. Itu sulit diperbaiki nanti, karena tidak bisa dihapus begitu saja --remove. Hanya menetapkan nilai tanpa --addharus ok.
Thomas Weller

58

Hanya untuk memperluas jawaban @ Joseph :

Setelah menerapkan perintah-perintah ini .gitconfigfile global Anda akan memiliki baris berikut (untuk mempercepat proses Anda cukup menyalinnya dalam file) :

[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, jawaban saya mencerminkan jawaban Joseph dan di sana Anda dapat menemukan detail lebih lanjut tentang pengaturan ini.
Igor Kustov

5
Butuh waktu lama untuk memperbaiki ini. 2 hal yang membuat saya tersesat: (1) .gitconfigFile yang saya edit bukan yang digunakan. Lihat stackoverflow.com/questions/2114111/… untuk mengidentifikasi yang sedang dimuat. (2) Jangan mencampur dan mencocokkan cmd =dan path =di gitconfig, TL; DR: delete cmd dan cukup gunakan path
matt wilkie

1
Sekarang gunakan git bash .... git difftool <filename> atau git difftool sederhana untuk menjalankan diff gui kdiff3 yang baru saja Anda atur.
Vivek

32

Untuk pengguna Mac

Berikut adalah jawaban yang diterima @ Joseph, tetapi dengan lokasi jalur instal default Mac kdiff3

(Perhatikan bahwa Anda dapat menyalin dan menempel ini dan menjalankannya dalam sekali jalan)

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
Jangan gunakan --addkarena itu dapat menghasilkan 2 entri konfigurasi jika Anda menjalankan perintah dua kali. Ini berantakan membersihkan ini, karena Anda tidak dapat menghapus satu entri lagi. Lihat git-scm.com/docs/git-config : "Beberapa baris dapat ditambahkan ke opsi"
Thomas Weller

11

Nah, masalahnya adalah bahwa Git tidak dapat menemukan KDiff3 di% PATH%.

Dalam instalasi Unix khas semua executable berada di beberapa lokasi terkenal ( /bin/, /usr/bin/, /usr/local/bin/, dll), dan satu dapat meminta program dengan hanya mengetik namanya di prosesor shell (misalnya cmd.exe:)).

Di Microsoft Windows, program biasanya dipasang di jalur khusus sehingga Anda tidak bisa mengetikkan kdiff3acmd sesi dan mendapatkan KDiff3 berjalan.

Solusi sulit: Anda harus memberi tahu Git ke mana menemukan KDiff3 dengan menentukan path lengkap ke kdiff3.exe. Sayangnya, Git tidak menyukai spasi dalam spesifikasi path dalam konfigurasi, jadi terakhir kali saya membutuhkan ini, saya berakhir dengan "C: \ Progra ~ 1 ... \ kdiff3.exe" kuno seolah-olah sudah terlambat 1990-an :)

Solusi sederhana: Edit pengaturan komputer Anda dan sertakan direktori dengan kdiff3.exe di% PATH%. Kemudian uji apakah Anda dapat memanggilnya dari cmd.exe dengan namanya dan kemudian jalankan Git.


8

Saya perlu menambahkan parameter baris perintah atau KDiff3 hanya akan terbuka tanpa file dan meminta saya untuk basis, lokal dan jarak jauh. Saya menggunakan versi yang disertakan dengan TortoiseHg .

Selain itu, saya harus menggunakan nama file DOS 8.3 lama yang bagus.

[merge]
    tool = kdiff3

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

Namun, sekarang berfungsi dengan benar.


6

Untuk mengubah keris ' jawabannya , dimulai dengan Git 2.20 (Q4 2018), perintah yang tepat untuk git mergetoolakan

git config --global merge.guitool kdiff3 

Itu karena " git mergetool" belajar mengambil pilihan " --[no-]gui", sama seperti "git difftool " dilakukan.

Lihat komit c217b93 , komit 57ba181 , komit 063f2bd (24 Okt 2018) oleh Denton Liu ( Denton-L) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 87c15d1 , 30 Okt 2018)

mergetool: terima -g/--[no-]guisebagai argumen

Sejalan dengan bagaimana difftoolmenerima -g/--[no-]guiopsi, buat mergetoolterima opsi yang sama untuk menggunakan merge.guitoolvariabel untuk menemukan mergetool default sebagai ganti merge.tool.


5

(Ketika mencoba mencari tahu cara menggunakan kdiff3 dari WSL git, saya akhirnya sampai di sini dan mendapatkan bagian terakhirnya, jadi saya akan memposting solusi saya untuk orang lain yang juga tersandung di sini ketika mencoba menemukan jawaban itu)

Cara menggunakan kdiff3 sebagai alat diff / merge untuk WSL git

Dengan pembaruan Windows 1903 itu jauh lebih mudah; cukup gunakan wslpath dan tidak perlu membagikan TMP dari Windows ke WSL karena sisi Windows sekarang memiliki akses ke sistem file WSL melalui \ 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

Sebelum Windows memperbarui 1903

Langkah-langkah untuk menggunakan kdiff3 yang diinstal pada Windows 10 sebagai alat diff / merge untuk git di WSL:

  1. Tambahkan direktori instalasi kdiff3 ke Windows Path.
  2. Tambahkan TMP ke variabel lingkungan Windows WSLENV (WSLENV = TMP / atas). Dir TMP akan digunakan oleh git untuk file sementara, seperti revisi file sebelumnya, jadi path harus ada di sistem file windows agar bisa berfungsi.
  3. Setel TMPDIR ke TMP di .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Konversi unix-path ke windows-path saat memanggil kdiff3. Contoh dari .gitconfig saya:
[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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.