2013-03-10 22 views
27

Làm thế nào tôi có thể buộc mergetool GUI luôn được hiển thị và tắt mọi giải pháp tự động?Làm thế nào tôi có thể buộc mergetool GUI (kdiff3) luôn được hiển thị?

Đôi khi có sự mâu thuẫn trong quá trình hợp nhất và tôi sử dụng mergetool, nó chỉ đơn giản immediatelly trở lại sau khi tôi nhấn Enter về câu hỏi "Hit trở lại để bắt đầu công cụ giải quyết hợp nhất (KDiff3)" và không có giao diện đồ họa được hiển thị và xung đột dường như được giải quyết.

Tôi có git được định cấu hình để sử dụng kdiff3 làm công cụ mergetool ngay bây giờ, nhưng nó cũng xảy ra khi tôi có codecompare làm công cụ xác định. Tôi biết rằng có một tùy chọn "Tự động lưu và thoát khi hợp nhất mà không có xung đột" trong kdiff3, về mặt lý thuyết có thể gây ra hành vi được mô tả, nhưng tôi có tùy chọn này bị tắt/bỏ chọn tất cả thời gian.

Ngoài ra, có trustExitCode tùy chọn trực tiếp trong git mergetool gitconfig, mà tôi đã đặt thành true, nhưng ngay cả khi tôi đặt thành false, GUI không được hiển thị.

Tôi không chắc chắn ai tự động giải quyết. Mergetool trong một số tiền xử lý hoặc kdiff3?

Tôi đang chạy trên Windows và đã cài đặt tiện ích mở rộng Git.

câu hỏi simillar cụ thể để KDiff3, được hỏi cũng ở đây: Kdiff3 won't open with mergetool command

Trả lời

31

Git có --auto cứng mã hoá như tùy chọn dòng lệnh để KDiff3, mà làm cho gui không hiển thị nếu tất cả các cuộc xung đột được tự động phân giải được bằng KDiff3. Trong cài đặt kdiff3 bạn có thể chỉ định tùy chọn dòng lệnh để bỏ qua, nhưng đặt --auto không có tác dụng đối với tôi.

Là một workaround tôi cấu hình biến thể riêng của tôi về KDiff3 như công cụ hợp nhất:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\"" 

này rất giống với những gì git sử dụng theo mặc định cho KDiff3, nhưng nếu không có sự --auto cờ.

Bây giờ bạn có thể gọi git mergetool -t kdiff3NoAuto hoặc định cấu hình kdiff3NoAuto làm mergetool trên toàn cầu và kdiff3 sẽ luôn hiển thị khi giải quyết xung đột.

Cập nhật: liên quan đến phần thứ hai của câu hỏi, nếu bạn thực sự muốn tắt bất kỳ giải pháp tự động nào, chỉ cần thêm --qall vào dòng lệnh kdiff3 ở trên. Nhưng sau đó bạn phải tự giải quyết tất cả thay đổi trong tệp theo cách thủ công, ngay cả những thay đổi không dẫn đến xung đột git. Kịch bản tốt nhất sẽ là: kdiff3 cho thấy cách git sáp nhập các tệp và để các xung đột mở để người dùng chọn. Bất cứ ai cũng biết làm thế nào để làm điều đó?

+0

Wauu, điều đó thật tuyệt. Cảm ơn! Bạn cũng có thể cân nhắc trả lời câu hỏi được liên kết hoặc đặt một số nhận xét bình luận ở đó vì nó có lẽ chính xác là cùng một vấn đề ở cuối. –

+0

Cảm ơn. Tôi đã liên kết với câu trả lời này trong câu hỏi khác. – PiQuer

+1

Thêm '--auto' vào tùy chọn dòng lệnh bị bỏ qua đã hoạt động đối với tôi với KDiff3 0.9.98 (64bit). Menu cài đặt -> Cấu hình KDiff3 -> tab Tích hợp. Hộp thoại thông tin được giải quyết tự động xuất hiện, nhưng sau đó kết quả hợp nhất được hiển thị, cho phép chỉnh sửa thêm. –

0

Thay vì cấu hình mergetool được gọi là chỉ khi có sự mâu thuẫn, chỉ cần cài đặt một trình điều khiển kết hợp với kdiff:

git config merge.kdiff.driver 'kdiff3 "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor" -L2 "Working Copy" --L3 "Version from Other Branch"' 

Bạn có thể làm cho trình điều khiển này trên toàn cầu bằng cách thêm --global. Nhưng bạn cần phải thêm một .gitattribute trong repo của bạn:

* merge=kdiff 
0

Hành vi của git mergetool là hoàn toàn phụ thuộc vào các công cụ hợp nhất lựa chọn và dòng lệnh Git đi với nó.Vì vậy, để thay đổi hành vi của nó, bạn cần phải tìm một dòng lệnh thực hiện những gì bạn muốn và cấu hình Git để sử dụng dòng lệnh đó.

Tôi đã có câu hỏi này bản thân mình (đặc biệt là liên quan đến KDiff3), và PiQuer's answer đã cho tôi một phần của con đường, nhưng nó đã cho tôi suy nghĩ. Có phải là một cách để nhân rộng hành vi mặc định của Git chính xác cho KDiff3 ngoại trừ không có tùy chọn --auto (đó là nguyên nhân khiến KDiff3 không hiển thị GUI).

Có vẻ như nguồn cho lệnh mặc định cho công cụ hợp nhất kdiff3 nằm trong tệp git/mergetools/kdiff3. Điều đó trông giống như kịch bản lệnh shell, vì vậy chúng ta nên có thể sao chép chính xác nó! Đưa rằng trên cùng một dòng, loại bỏ --auto, và thoát mọi thứ cho chúng ta này:

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi" 

Các base_presentmerge_tool_path biến không được đề cập cụ thể trong tài liệu Git như là có sẵn để sử dụng trong mergetool.<tool>.cmd, vì vậy nó có thể tại một số trong tương lai, lệnh này có thể không hoạt động. Tuy nhiên, chúng có thể dễ dàng được thay thế bằng lệnh để kiểm tra xem liệu BASE có đề cập đến tệp tồn tại hay không và đường dẫn mã hóa cứng cho KDiff3 tương ứng.

Lưu ý rằng lệnh trên sẽ thay thế lệnh mặc định cho công cụ hợp nhất kdiff3 của Git thay vì tạo một công cụ riêng biệt.

Về một vài điểm khác trong câu hỏi ban đầu:

  • Thiết lập trustExitCode nói với Git xem mã lối ra của công cụ hợp nhất là một dấu hiệu thích hợp cho dù việc hợp nhất đã thành công. Nó sẽ không ảnh hưởng đến hành vi của công cụ hợp nhất mà là hành vi của Git khi công cụ hợp nhất đã thoát. Xem số manual for git-mergetool.
  • Độ phân giải tự động mà bạn thấy sau khi nhập git mergetool là tất cả được thực hiện bởi chính công cụ hợp nhất. git mergetool chỉ đơn thuần gọi công cụ bên ngoài trên các phiên bản tệp cần được hợp nhất.
Các vấn đề liên quan