2013-03-07 24 views
7

Giả sử tôi đang chỉnh sửa tệp. Nếu tôi lưu tệp, git-diff sẽ cho tôi những thay đổi liên quan đến chỉ mục. Tôi muốn nhận được các thay đổi liên quan đến chỉ mục mà không lưu tệp trước - đối với chênh lệch "thời gian thực".Có thể git-diff một tập tin chống lại đầu vào tiêu chuẩn?

Một giải pháp là ghi các thay đổi chưa được lưu vào một tệp tạm thời (ví dụ: lưu tệp ở nơi khác), ghi tệp dàn dựng sang một tệp tạm thời khác (git show :file > tempfile2) rồi git-diff tempfile tempfile2. Tuy nhiên điều đó có vẻ không phù hợp.

Có cách nào tốt hơn không?

+1

Tại sao không chỉ lưu tệp? Những gì nói chống lại nó? –

+2

Sẽ rất tuyệt nếu tránh lưu tệp nếu tôi chỉ có thể sử dụng đường ống. –

+0

@AndyStewart: tại sao nó đẹp? Chỉ cần ném một tập tin trong tmp. Nó không khó, nó không phải là rất nhiều công việc ... chắc chắn ít hơn rất nhiều so với cố gắng để làm việc xung quanh yêu cầu của git (nhưng xem câu trả lời của Ash Berlin). – siride

Trả lời

2

Cải thiện câu trả lời của Ash Berlin.

Điều này cho phép bạn sử dụng các tính năng đẹp của git-diff.

git show :file | git diff --no-index -- - temp_saved_path 

Lưu ý rằng điều này vẫn có thể không thuận tiện như bạn muốn, vì bạn vẫn phải ghi vào tệp tạm thời. Cho đến khi bạn lưu tệp, các thay đổi không phải là trên đĩa ở tất cả (chỉ trong bộ nhớ) hoặc trong một số loại tệp tạm thời phụ thuộc vào trình soạn thảo. Có thể Vim có thể làm điều này một cách liền mạch trong một bước, nhưng tôi không quen thuộc để nói.

+0

Vim cho phép bạn chuyển nội dung tới stdin của lệnh bên ngoài đang được gọi. Vì vậy, bây giờ tôi viết phiên bản chỉ mục của tệp vào một tệp tạm thời và chuyển tệp trong bộ nhớ tới stdin: 'git show: file> tmpfile && git diff - tmpfile -'. –

+0

Ngoài ra, nếu một hoặc cả hai đường dẫn tệp nằm ngoài repo git thì '--no-index' được suy ra tự động. –

8

Kể từ git 1.5.1 đã có một sự lựa chọn để diff chống stdin - nó chỉ không được ghi nhận

$ echo foo | git diff --no-index -- my_file -

On chơi với điều này tôi thêm một chút nhận ra điều này có thể không phải những gì các OP (hoặc I) muốn - nó phân biệt trạng thái hiện tại của tệp thành stdin, không phải trạng thái cam kết cuối cùng của tệp thành stdin. Một cái gì đó như thế này sẽ làm điều đó

$ echo foo | diff -u <(git show :my_file) -

Lưu ý điều này không có nghĩa là cách gọi khác trực tiếp mà có thể không nhận một số cài đặt trong cấu hình git của bạn. Về cơ bản như ams nói trong câu trả lời của mình.

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