2014-07-26 16 views
23

Trong kho của tôi, nếu tôi gõTại sao `git diff` không gọi công cụ tìm khác biệt bên ngoài?

$ git diff some-file 

hoặc

$ git difftool some-file 

tôi nhận được màn hình hiển thị khác trong thiết bị đầu cuối. Tôi nghĩ rằng điều này không nên xảy ra, bởi vì tôi đã thiết lập một công cụ diff bên ngoài, như thể hiện bởi đầu ra của git config -l:

$ git config -l 
user.name=blah blah 
user.email=blah blah 
http.sslverify=true 
diff.external=/home/daniel/bin/git-diff <--This is the important line 
push.default=simple 
core.filemode=false 
core.editor=gedit 
alias.tree=log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset) 
     %C(black)[%cr]%C(reset) %x09%C(black)%an: %s %C(reset)' 
core.repositoryformatversion=0 
core.filemode=false 
core.bare=false 
core.logallrefupdates=true 
core.ignorecase=true 
remote.origin.url=https://[email protected]/git/pyle.git 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 
branch.daniel.remote=origin 
branch.daniel.merge=refs/heads/daniel 

File git-diff tham chiếu trong dòng diff.external trông như thế này

#!/bin/bash 

meld $2 $5 

Tại sao không git diff gọi meld?

tôi nhận được hành vi tương tự nếu tôi đặt mọi thứ lên để git config -l có dòng sau:

diff.tool = meld 

hoặc

diff.external = usr/bin/meld 

Note: kho khác trên máy tính của tôi không có vấn đề này.

liên quan, nhưng không tương đương, SO câu hỏi:

  1. What is the difference between git diff and git difftool?
  2. Cannot make git diff use diff.external for external diff tool
+0

Tại sao bạn sử dụng đối số thứ hai và thứ năm? – merlin2011

+0

@ merlin2011: sự hiểu biết của tôi là git diff chuyển bảy đối số vào công cụ tìm khác biệt bên ngoài và meld chỉ cần hai trong số chúng. – DanielSank

Trả lời

15

tôi nhận được màn hình hiển thị khác trong thiết bị đầu cuối. Tôi điều này không nên xảy ra, bởi vì tôi đã thiết lập một công cụ diff bên ngoài

Vâng, nó nên: diff.external cho "trong thiết bị đầu cuối hiển thị diff".

(từ git config man page)

diff.external 

Nếu biến cấu hình này được thiết lập, thế hệ khác không được thực hiện bằng cách sử dụng máy móc thiết bị khác bên trong, nhưng cách sử dụng lệnh cho.
Có thể được ghi đè bằng biến môi trường GIT_EXTERNAL_DIFF.
Lệnh này được gọi với các tham số như được mô tả trong "git Diffs" trong git (1). Lưu ý: nếu bạn muốn sử dụng chương trình khác biệt bên ngoài chỉ trên một tập hợp con các tệp của bạn, bạn có thể muốn sử dụng gitattributes(5) thay thế.

question you link sẽ không thể đóng vai trò của "ngoại vi khác".

Viewing a diff visually with another tool được thực hiện với:

git difftool --dir-diff shaOfHisCheckIn^! 
git difftool --tool=meld --dir-diff shaOfHisCheckIn^! 
git difftool -t meld -d shaOfHisCheckIn^! 

meld thể được cấu hình trên Windows như một difftool: xem "Git Diff and Meld on Windows".


Nếu bạn muốn cấu hình meld cho git diff, bạn có thể (on Ubuntu) use the diff.external, but with a wrapper script:

tạo ra một tập tin gọi là git-diff.sh, sử dụng nội dung sau đây:

#!/bin/bash 
meld "$2" "$5" > /dev/null 2>&1 

Lưu địa chỉ này đến một địa điểm như /usr/local/bin, cấp cho nó quyền thực thi:

$ sudo mv git-diff.sh /usr/local/bin/ 
$ sudo chmod +x /usr/local/bin/git-diff.sh 

Bước cuối cùng là để mở file $HOME/.gitconfig của bạn và thêm một vài dòng sau:

[diff] 
     external = /usr/local/bin/git-diff.sh 

Lần sau khi bạn gõ git diff trong một dự án Git với thay đổi, Meld sẽ được đưa ra hiển thị cho bạn một trình xem khác biệt giữa các cửa sổ.
Lưu ý rằng bạn được yêu cầu đóng phiên bản mở của meld trước khi mở trình xem khác tiếp theo.

+3

'git difftool' có vẻ là giải pháp. Tôi đã cố gắng bằng cách sử dụng một kịch bản wrapper nhưng đối với một số lý do mà không hoạt động. – DanielSank

10

Dường như git diff (ít nhất, tính đến git phiên bản 1.7.12.4) sẽ không chạy bất cứ điều gì khác hơn là nội bộ, giao diện điều khiển chỉ diff trên một tệp nằm trong tình trạng "cả hai biến dạng". Tuy nhiên, git mergetool hoạt động trên các tệp như vậy.

+1

Điều này vẫn đúng với phiên bản git 1.9.1, Thật khó chịu! Tôi chỉ lãng phí một giờ cố gắng tìm ra lý do tại sao thiết lập cấu hình git của tôi cho difftool đột nhiên ngừng hoạt động. –

+2

Vẫn là trường hợp trên 'git phiên bản 2.5.4 (Apple Git-61)'. Giao diện điều khiển chỉ 3-cách-hợp nhất quy trình làm việc là một điểm đau khá lớn. Có thực sự là một thiếu hụt rất lớn của các công cụ khác nhau có khả năng giao diện điều khiển bản địa.Tôi tin rằng con đường tôi sẽ thực hiện là cho phép git đổ các dấu xung đột vào các tệp, và sau đó sử dụng một công cụ đơn giản, mà tôi sẽ viết, để xử lý chúng để tạo ra các kết quả đầu ra có thể đọc được. –

+1

Aha! @ trebor-thô lỗ, bạn chỉ cần lưu sự tỉnh táo của tôi với tự hỏi tại sao không có lựa chọn difftool của tôi đã làm việc – jaygooby

1

Tôi thường chỉ muốn kiểm tra xem các thay đổi tôi sắp nhận phòng có chính xác không. Vì vậy, tôi đã làm theo các thủ tục đề nghị here (tương tự như một ghi chú của VonC). Tuy nhiên, chạy git difftool vẫn không mở meld. Sau đó, tôi đã tạo bí danh:

alias git-diff='git difftool $(git rev-parse HEAD)' 

Lưu tệp này vào .bashrc hoặc .zshrc hoặc cấu hình tương ứng cho vỏ của bạn. Điều này về cơ bản so sánh trạng thái của nhánh với commit trước đó trên nhánh.

Thực hiện git-diff để xem các thay đổi trên tệp cho mỗi tệp hoặc git-diff --dir để xem tất cả thay đổi trong chế độ xem thư mục.

Các vấn đề liên quan