Làm thế nào để tạo nhật ký git-diff và git bỏ qua các tệp mới và bị xóa?


154

Đôi khi, có một vài tệp được thay đổi cùng với một số tệp mới, bị xóa và / hoặc được đổi tên. Khi thực hiện git diffhoặc git-logtôi muốn bỏ qua chúng, vì vậy tôi có thể phát hiện ra các sửa đổi tốt hơn.

Trên thực tế, liệt kê tên của các tệp mới và bị xóa mà không có nội dung của chúng sẽ là tốt nhất. Đối với "cũ" được đổi tên thành "mới", tôi muốn tùy ý nhận được sự khác biệt giữa "cũ" và "mới".

Câu trả lời:


217

Các --diff-filtertùy chọn làm việc với cả hai diffvà đăng nhập.

Tôi sử dụng --diff-filter=Mrất nhiều trong đó hạn chế đầu ra khác nhau chỉ sửa đổi nội dung.

Để phát hiện đổi tên và bản sao và sử dụng chúng trong đầu ra khác, bạn có thể sử dụng -M-Ctương ứng, cùng với các tùy chọn Rvà .C--diff-filter


3
Khi được sử dụng với git logđiều này sẽ làm cho nó hoàn toàn bỏ qua các cam kết chỉ thêm và / hoặc xóa các tệp.
qqx

7
Có cách nào để thực sự loại trừ chỉ một loại dữ liệu không? Một cái gì đó giống như--diff-filter=!D
Kamil Dziedzic

24
@Kamil Vâng, có. Trích dẫn từ tài liệu:Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
LambdaCruiser

62
  • Tài liệu chính thức:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

Chỉ chọn các tệp được thêm (A), Sao chép (C), Đã xóa (D), Sửa đổi (M), Đổi tên (R), có loại của chúng (ví dụ: tệp thông thường, symlink, mô hình con, Thay đổi) (T), là Unmerged (U), Unknown (X) hoặc đã ghép nối Broken (B). Bất kỳ sự kết hợp của các ký tự bộ lọc (bao gồm không có) có thể được sử dụng.

Khi * (Tất cả hoặc không) được thêm vào kết hợp, tất cả các đường dẫn được chọn nếu có bất kỳ tệp nào khớp với các tiêu chí khác trong so sánh; nếu không có tệp phù hợp với tiêu chí khác, không có gì được chọn.

Ngoài ra, những chữ cái viết hoa này có thể được rút gọn để loại trừ. Ví dụ: --diff-filter = quảng cáo loại trừ các đường dẫn được thêm và xóa.

Ví dụ: chỉ hiển thị các tệp đã thêm, thay đổi, đã sửa đổi, loại trừ các tệp đã xóa:

git diff --diff-filter=ACM

2
Lưu ý tốt về việc sử dụng tùy chọn chữ thường để loại trừ đường dẫn và tùy chọn chữ in hoa để bao gồm đường dẫn.
stuyam

-3

UPDATE: Các câu trả lời được chấp nhận bởi Charles Bailey là đúng; các chức năng mong muốn đã được tích hợp vào git.

Tôi sẽ để câu trả lời này ở đây vì nó có thể cung cấp ý tưởng cho những thứ không được tích hợp trong git.


git diffhiển thị các tập tin mới và bị xóa bằng cách so sánh chúng với /dev/null. Không quá khó để viết một cái gì đó (tôi sẽ sử dụng Perl cho mình) để tìm /dev/nullvà lọc ra các dòng sau cho đến khác biệt tiếp theo. Sau đó git diff ... | the-filter.

Đổi tên tập tin là một vấn đề khác nhau; Tôi chưa (chưa) có câu trả lời hay cho điều đó.


Điều này không sao, nhưng theo cách này tôi sẽ mất khả năng sử dụng máy nhắn tin (ít hơn) chỉ khi cần, phải không?
maaartinus

@maaartinus: Tôi cho là vậy; Tôi đã không nghĩ về điều đó. (Cá nhân, tôi đặt pager git của tôi để "mèo" và sử dụng ... | lessmột cách rõ ràng.) Bạn có thể nhìn vào less's -Ehoặc -Ftùy chọn (mặc dù trên hệ thống của tôi nó không cho tôi thấy đầu ra).
Keith Thompson

OK, tốt thôi, nhưng hãy nhìn vào câu trả lời khác.
maaartinus
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.