Làm thế nào để tạo một bản vá bỏ qua sự khác biệt thụt lề trong mã?


7

Tôi đang cố gắng tạo một bản vá bằng cách sử dụng công cụ diff. Nhưng phải đối mặt với một vấn đề. Cách tôi đang làm là bên dưới.

Tôi đã tạo một Thư mục có tên a và đặt tệp gốc vào đó.

a/original_file.c

Bây giờ tôi đã tạo Thư mục khác có tên b và đặt cùng một tệp có nội dung được sửa đổi vào đó.

b/original_file.c

Bây giờ nội dung của b/original_file.ctập tin tôi đã sao chép từ internet và đưa nó vào một số trình soạn thảo văn bản.

Sau khi đưa ra lệnh : diff -Naur a b > patch_file.patch, tệp patch_file.patchđược tạo và nó có một số thay đổi không mong muốn (liên quan đến thụt lề).

Ví dụ:

return mg_nw (MG_READY_NOY, &rmsg, seqnr,
-                 sizeof (struct mg_rdy_notify));
+                  sizeof (struct mg_rdy_notify)); 

Bây giờ bạn có thể thấy có những thay đổi liên quan đến thụt đầu dòng sizeof (struct mg_rdy_notify))được thay thế bằng cùng sizeof (struct mg_rdy_notify))nhưng một cơ sở của thụt đầu dòng là những gì chúng ta không muốn.

Câu trả lời:


7

diffcó nhiều hơn một tùy chọn liên quan đến khoảng trắng. Tuy nhiên, một là ít hữu ích cho các bản vá. Trang hướng dẫn đưa ra gợi ý tối nghĩa, đề cập đến cả GNU :

   -B, --ignore-blank-lines
          ignore changes where lines are all blank
   -b, --ignore-space-change
          ignore changes in the amount of white space
   -w, --ignore-all-space
          ignore all white space

FreeBSD

   -b     Ignore changes in amount of white space.
   -B     Ignore changes that just insert or delete blank lines.
   -w     Ignore white space when comparing lines.

Thông thường một người sử dụng -b, bởi vì điều đó ít có khả năng bỏ qua những thay đổi đáng kể. Nếu bạn đã thay đổi chỉ thụt, thì cả hai -b-wcho cùng một kết quả. Mặt khác, nếu bạn chèn các khoảng trắng ở nơi không có hoặc xóa các khoảng trắng hiện có (không để lại), đó có thể là một thay đổi trong chương trình của bạn. Đây là một ví dụ:

$ diff foo.c foo2.c
4c4
<     setlocale(LC_ALL, "");
---
>     setlocale(LC_ALL, " ");
6,7c6,7
<     printw("\U0001F0A1");
<     getch();
---
>     printw ("\U0001F0A1");
>     getch();  /* comment */
$ diff -b foo.c foo2.c
4c4
<     setlocale(LC_ALL, "");
---
>     setlocale(LC_ALL, " ");
6,7c6,7
<     printw("\U0001F0A1");
<     getch();
---
>     printw ("\U0001F0A1");
>     getch();  /* comment */
$ diff -w foo.c foo2.c
7c7
<     getch();
---
>     getch();  /* comment */

Trong trường hợp này, -wtùy chọn cho phép bạn bỏ qua thay đổi setlocaletham số (có lẽ không phải là mục đích).

Nhân tiện, POSIX diff chỉ có -btùy chọn.

Đối với patch, tài liệu POSIX-l tùy chọn:

-l
(Chữ ell .) Gây ra bất kỳ chuỗi <blank>ký tự nào trong tập lệnh khác biệt để khớp với bất kỳ chuỗi <blank>ký tự nào trong tệp đầu vào. Các nhân vật khác sẽ được kết hợp chính xác.


Tôi đã rất ngạc nhiên khi điều này có ít upvote cho đến khi tôi nhận thấy dấu thời gian. Cảm ơn đã dành thời gian; điều này rất hữu ích :)
Thẻ đại diện

không có vấn đề gì - Tôi đã làm việc thông qua các câu hỏi tồn đọng mà tôi thấy thú vị ...
Thomas Dickey

8

diffcó một tùy chọn để bỏ qua các thay đổi khoảng trắng ( -w), tương tự cho patch( -l). Nói chung, đó là một ý tưởng tồi để bỏ qua khoảng trắng, vì vậy bạn nên bảo lưu việc sử dụng nó cho các trường hợp đặc biệt, khi biên tập viên của ai đó đã làm điều gì đó kinh khủng ...


Cảm ơn @frontschutz, vì vậy, cuộc diễu hành của tôi bây giờ sẽ khác -Naur -wab ??
Ram
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.