Bỏ qua * tất cả * các thay đổi khoảng trắng với git-diff giữa các lần cam kết


78

Tôi đang xem xét cơ sở mã và sửa các lỗi kỳ lạ về khoảng trắng và nói chung là sửa lỗi thụt lề và những thứ như vậy, và tôi muốn đảm bảo rằng mình không vô tình thực hiện bất kỳ thay đổi nào khác, vì vậy tôi đang git diff -wcố gắng hiển thị sự khác biệt trong tất cả các tệp đã thay đổi trong khi bỏ qua khoảng trắng sự khác biệt. Vấn đề là điều này không thực sự bỏ qua tất cả các khác biệt về khoảng trắng — ít nhất là những gì tôi coi là chỉ là khác biệt về khoảng trắng. Ví dụ, trong đầu ra sau đây từ git diff -w,

-"Links":
-{
-
-    "Thermal":
-
-{
-
+  "Links": {
+    "Thermal": {

bạn có thể thấy rằng tôi chỉ

  1. loại bỏ các dòng trống thừa,
  2. đặt dấu ngoặc nhọn vào cuối dòng của khóa có giá trị mà chúng mở, và
  3. thụt vào để phù hợp với ngữ cảnh

Câu hỏi này thoạt đầu trông có vẻ như có thể đưa ra câu trả lời, nhưng nó đề cập đến sự khác biệt giữa hai tệp cụ thể , không phải giữa hai cam kết cụ thể . Mọi thứ khác được tìm kiếm cũng đều đi vào ngõ cụt. Ví dụ: câu hỏi này là về hợp nhất, không hiển thị sự khác biệt và câu hỏi này đề cập đến việc hiển thị sự khác biệt cấp độ từ, v.v.


1
Đối với người dùng Bitbucket, có một bản sửa lỗi được đề xuất cho vấn đề này, nhưng nó vẫn chưa được mã hóa và có thể sẽ không xảy ra cho đến khi có đủ sự quan tâm. Bạn có thể vào trang Bitbucket và thể hiện sự ủng hộ của mình. Ban đầu, tôi đã tìm thấy trang hiện tại trong khi tìm kiếm giải pháp trong Bitbucket, vì vậy nếu có những người khác trong tình huống này, vui lòng vào đây và bỏ phiếu!
paultamalunas

git difftool+ kdiff3 là một trong những lựa chọn
Tim Abell

Câu trả lời:


67

Có lẽ có một câu trả lời tốt hơn, nhưng giải pháp tốt nhất mà tôi tìm thấy cho đến nay là điều này.

Đầu tiên, bạn phải kiểm soát định nghĩa của "khoảng trắng" mà Git hiện đang sử dụng.

git config core.whitespace '-trailing-space,-indent-with-non-tab,-tab-in-indent'

Tiếp theo, bạn phải kiểm soát định nghĩa của một từ được sử dụng. Thay vì chỉ sử dụng git diff -w, hãy thêm --word-diff-regex='[^[:space:]]':

git diff -w --word-diff-regex='[^[:space:]]'

Bạn vẫn sẽ thấy ngữ cảnh (trong trường hợp của tôi, vì tôi đang cố gắng đảm bảo rằng không có sự khác biệt nào ngoại trừ sự khác biệt về khoảng trắng) không hữu ích. Bạn có thể sử dụng -U0để yêu cầu Git cung cấp cho bạn 0 dòng ngữ cảnh, như vậy,

git diff -w -U0 --word-diff-regex='[^[:space:]]'

nhưng bạn vẫn sẽ nhận được đầu ra trông khá giống với ngữ cảnh, nhưng vẫn tốt hơn nhiều so với việc xem xét tất cả các thay đổi một cách cẩn thận và thủ công để đảm bảo chúng chỉ là những thay đổi khoảng trắng.

Bạn cũng có thể thực hiện tất cả những điều trên trong một lệnh. Các -ccờ thay đổi cấu hình git chỉ dành riêng cho một lệnh.

git -c core.whitespace=-trailing-space,-indent-with-non-tab,-tab-in-indent diff -U0 --word-diff-regex='[^[:space:]]'

2
@Torek - một phần khác của Git tốt. Tại sao lại khó có thể khác biệt mà không có khoảng trắng vậy ??? Tôi đang sử dụng máy Windows đang cố gắng đánh giá PR trên các tệp dự án Visual Studio. Tôi không quan tâm đến sự khác biệt CR, LF hoặc CRLF, nhưng đó là những gì Git đang lấp đầy thiết bị đầu cuối của tôi.
jww

2
và mọi người không hiểu tại sao tôi ghét git
Gerry

Dù sao để tạo một bí danh cho nó?
StR

2
@StR bạn có thể làm một bí danh trong .gitconfignhững điều sau đây bạn [alias]phần: diffw = diff -w -U0 --word-diff-regex=[^[:space:]]
mattwright

1
@NSjonas Tôi cũng gặp lỗi tương tự. Bạn cần thêm dấu ngoặc kép. Tôi đã chỉnh sửa các lệnh trong câu trả lời.
ngon miệng từ

34

Bỏ qua tất cả các thay đổi khoảng trắng với git-diff giữa các lần cam kết

Câu hỏi này thoạt nhìn có vẻ như nó có thể đưa ra câu trả lời, nhưng nó đề cập đến sự khác biệt giữa hai tệp cụ thể, không phải giữa hai cam kết cụ thể. Tất cả mọi thứ khác được đảo ngược bằng cách tìm kiếm cũng là một ngõ cụt ....

Tôi nghĩ rằng bạn đang gặp khó khăn vì Git là công cụ sai cho công việc. Nó không làm cho nhiệm vụ trở nên dễ dàng và nhường chỗ để chứa công cụ là cách tiếp cận sai lầm. Các công cụ được cho là hiệu quả với bạn chứ không phải ngược lại .

Thực hiện một bản sao thứ hai, và sau đó kiểm tra bản sửa đổi bắt đầu được đề cập. Sau đó chạy diff thường xuyên trên chúng sử dụng phiên bản hiện tại của bạn: diff -bur --ignore-all-space <dir1> <dir2>.

Dưới đây là một số tùy chọn chodiff

-i, --ignore-case
       ignore case differences in file contents

-E, --ignore-tab-expansion
       ignore changes due to tab expansion

-Z, --ignore-trailing-space
        ignore white space at line end

-b, --ignore-space-change
       ignore changes in the amount of white space

-w, --ignore-all-space
       ignore all white space

-B, --ignore-blank-lines
       ignore changes where lines are all blank

2
Không có tùy chọn nào trong số này giúp ích trong trường hợp này: diff vẫn coi ngắt dòng khác với việc không ngắt dòng.
Gilles 'VẬY- đừng có xấu xa nữa'

1
với git mới nhất (v2.20.1):error: invalid option: -Z
Morteza Ziyae

4
@MortezaZiaeemehr tùy chọn dành cho difflệnh, không phải gitlệnh. Câu trả lời này khuyên bạn nên sử dụng công cụ khác biệt và không sử dụng git cho công việc hiện tại.
saraf

Cũng có vấn đề với tùy chọn không hợp lệ. --ignore-all-space--ignore-cr-at-eollàm việc cho tôi.
mix3
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.