Git: Cách cấu hình KDiff3 làm công cụ hợp nhất và công cụ tìm khác biệt


218

Gần đây tôi đang sử dụng GitExtension 2.46, nhưng phiên bản Git có cùng là 1.9.4.msysgit.2. Sẵn sàng chỉ sử dụng các lệnh Git, tôi đã gỡ cài đặt GitExtension và cài đặt phiên bản mới nhất có sẵn của GitKDiff3 .

Khi tôi thực hiện hợp nhất và có xung đột, tôi chạy lệnh sau:

$ git mergetool

Sau đó tôi nhận được tin nhắn:

Công cụ hợp nhất kdiff3 không khả dụng dưới dạng 'kdiff3'.

Tôi đoán nó phải bằng con đường KDiff3.

Môi trường

  • HĐH: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0,9,98 (64 bit)

Câu hỏi:

  • Tôi phải cấu hình gì trong tệp .gitconfig cho lệnh $ git mergetoolđể mở GUI KDiff3 với các phiên bản LOCAL , REMOTE , BASEMERGED của tệp bị xung đột?

  • Làm thế nào để cấu hình nó để sử dụng nó có công cụ diff?


Câu trả lời:


373

Những trang web này rất hữu ích, gần như, mergetooldifftool . Tôi đã sử dụng cấu hình toàn cầu, nhưng có thể được sử dụng bởi kho lưu trữ mà không gặp vấn đề gì. Bạn chỉ cần thực hiện các lệnh sau:

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

Việc sử dụng trustExitCodetùy chọn phụ thuộc vào những gì bạn muốn làm khi công cụ diff trở lại. Từ tài liệu :

git-Difftool gọi một công cụ diff riêng lẻ trên mỗi tệp. Các lỗi được báo cáo bởi công cụ diff được bỏ qua theo mặc định. Sử dụng --trust-exit-code để thực hiện thoát git-Difftool khi một công cụ tìm khác biệt được gọi trả về mã thoát khác không.


5
Tuy nhiên, tại sao tôi muốn git-Difftool không thoát nếu kdiff3 không thành công?
David Torres

9
Để tôi có công cụ tìm khác biệt được Visual Studio 2015 công nhận, tôi đã phải thay đổi dòng git config --global --add diff.guitool kdiff3 này thành: git config --global --add diff.tool kdiff3
Guillaume Raymond

2
@DavidTorres Có lẽ vì các công cụ Windows hoạt động kém (thoát ra với mã khác không thành công) hủy hoại nó cho tất cả mọi người.
Matthew Flaschen

2
Theo các tài liệu được tham chiếu, đặt TrustExitCode thành false là không cần thiết, vì mặc định là bỏ qua nó.
matt wilkie

7
AFAIK, --addsẽ thêm mục nhập thứ hai hoặc thứ ba khi được gọi nhiều lần. Điều đó thật khó để sửa chữa sau này, vì đơn giản là nó không thể được gỡ bỏ --remove. Chỉ cần thiết lập một giá trị mà không --addnên là ok.
Thomas Weller

58

Chỉ để mở rộng câu trả lời của @ Joseph :

Sau khi áp dụng các lệnh này, .gitconfigtệp toàn cầu của bạn sẽ có các dòng sau (để tăng tốc quá trình bạn có thể chỉ cần sao chép chúng trong tệp) :

[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, câu trả lời của tôi phản ánh câu trả lời của Joseph và ở đó bạn có thể tìm thêm chi tiết về cài đặt này.
Igor Kustov

5
Tôi đã mất một thời gian dài để có được điều này đúng. Có 2 điều khiến tôi lạc lối: (1) Tập .gitconfigtin tôi đang chỉnh sửa không phải là tập tin đang được sử dụng. Xem stackoverflow.com/questions/2114111/ đá để xác định (các) cái đang được tải. (2) Không trộn và kết hợp cmd =path =trong gitconfig, TL; DR: xóa cmd và chỉ sử dụng đường dẫn
matt wilkie

1
Bây giờ trên git bash sử dụng .... git Difftool <tên tệp> hoặc git Difftool đơn giản để chạy diff gui kdiff3 bạn vừa đặt.
Vivek

32

Dành cho người dùng Mac

Đây là câu trả lời được chấp nhận của @ Joseph, nhưng với vị trí đường dẫn cài đặt Mac mặc định của kdiff3

(Lưu ý rằng bạn có thể sao chép và dán nó và chạy nó trong một lần)

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
Không sử dụng --addvì điều đó có thể dẫn đến 2 mục cấu hình nếu bạn chạy lệnh hai lần. Đó là một mớ hỗn độn làm sạch điều này, bởi vì bạn không thể xóa một mục nữa. Xem git-scm.com/docs/git-config : "Có thể thêm nhiều dòng vào một tùy chọn"
Thomas Weller

11

Chà, vấn đề là Git không thể tìm thấy KDiff3 trong% PATH%.

Trong một cài đặt điển hình Unix tất cả các thực thi cư trú tại một số địa điểm nổi tiếng ( /bin/, /usr/bin/, /usr/local/bin/, vv), và người ta có thể gọi một chương trình đơn giản bằng cách gõ tên của nó trong một bộ xử lý vỏ (ví dụ cmd.exe:)).

Trong Microsoft Windows, các chương trình thường được cài đặt trong các đường dẫn chuyên dụng, do đó bạn không thể chỉ cần nhập kdiff3một cmdphiên và chạy KDiff3.

Giải pháp cứng: bạn nên cho Git biết nơi tìm KDiff3 bằng cách chỉ định đường dẫn đầy đủ tới kdiff3.exe. Thật không may, Git không thích khoảng trắng trong đặc tả đường dẫn trong cấu hình của nó, vì vậy lần cuối cùng tôi cần điều này, tôi đã kết thúc với "C: \ Progra ~ 1 ... \ kdiff3.exe" như thể nó đã muộn Những năm 1990 :)

Giải pháp đơn giản: Chỉnh sửa cài đặt máy tính của bạn và bao gồm thư mục với kdiff3.exe trong% PATH%. Sau đó kiểm tra xem bạn có thể gọi nó từ cmd.exe bằng tên của nó và sau đó chạy Git.


8

Tôi cần thêm các tham số dòng lệnh hoặc KDiff3 sẽ chỉ mở mà không có tệp và nhắc tôi về cơ sở, cục bộ và từ xa. Tôi đã sử dụng phiên bản được cung cấp với TortoiseHg .

Ngoài ra, tôi cần phải sử dụng tên tệp DOS 8.3 cũ.

[merge]
    tool = kdiff3

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

Tuy nhiên, nó hoạt động chính xác bây giờ.


6

Để sửa đổi câu trả lời của kris , bắt đầu với Git 2.20 (Q4 2018), lệnh thích hợp sẽ làgit mergetool

git config --global merge.guitool kdiff3 

Đó là bởi vì " git mergetool" đã học cách --[no-]guichọn tùy chọn "", giống như " git difftool".

Xem cam kết c217b93 , cam kết 57ba181 , cam kết 063f2bd (24 tháng 10 năm 2018) của Denton Liu ( Denton-L) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 87c15d1 , ngày 30 tháng 10 năm 2018)

mergetool: chấp nhận -g/--[no-]guilàm đối số

Để phù hợp với cách difftoolchấp nhận một -g/--[no-]guitùy chọn, hãy mergetoolchấp nhận tùy chọn tương tự để sử dụng merge.guitoolbiến để tìm sự hợp nhất mặc định thay vì merge.tool.


5

.

Cách sử dụng kdiff3 làm công cụ diff / merge cho WSL git

Với bản cập nhật Windows 1903, nó dễ dàng hơn nhiều; chỉ cần sử dụng wslpath và không cần chia sẻ TMP từ Windows sang WSL vì phía Windows hiện có quyền truy cập vào hệ thống tệp WSL thông qua \ 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

Trước khi cập nhật Windows 1903

Các bước để sử dụng kdiff3 được cài đặt trên Windows 10 dưới dạng công cụ diff / merge cho git trong WSL:

  1. Thêm thư mục cài đặt kdiff3 vào Windows Path.
  2. Thêm TMP vào biến môi trường Windows WSLENV (WSLENV = TMP / up). Thư mục TMP sẽ được git sử dụng cho các tệp tạm thời, như các phiên bản trước của tệp, vì vậy đường dẫn phải nằm trên hệ thống tệp windows để làm việc này.
  3. Đặt TMPDIR thành TMP trong .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Chuyển đổi unix-path thành windows-path khi gọi kdiff3. Mẫu .gitconfig của tôi:
[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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.