Khi vá những gì sự khác biệt giữa các đối số -p0 và -p1?


19

Sự khác biệt giữa patch -p0và là patch -p1gì?

Có sự khác biệt nào không?

Câu trả lời:


23

Cách phổ biến nhất để tạo một bản vá là chạy difflệnh hoặc lệnh tích hợp sẵn trong một số điều khiển phiên bản diff. Đôi khi, bạn chỉ đang so sánh hai tệp và bạn chạy diffnhư thế này:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

Sau đó, bạn nhận được một bản vá có chứa các thay đổi cho một tệp và hoàn toàn không chứa tên tệp. Khi bạn áp dụng bản vá đó, bạn cần chỉ định tệp nào bạn muốn áp dụng nó cho:

patch <alice_to_bob.patch version2_by_alice.txt

Thông thường, bạn đang so sánh hai phiên bản của toàn bộ dự án nhiều tệp có trong một thư mục. Một cách gọi điển hình của diffhình như thế này:

diff -ru old_version new_version >some.patch

Sau đó, bản vá chứa tên tệp, được đưa ra trong dòng tiêu đề như diff -ru old_version/dir/file new_version/dir/file. Bạn cần nói patchđể loại bỏ tiền tố ( old_versionhoặc new_version) khỏi tên tệp. Đó là những gì -p1có nghĩa là: tước một cấp của thư mục.

Đôi khi, các dòng tiêu đề trong bản vá chứa tên tệp trực tiếp mà không có phần dẫn. Điều này là phổ biến với các hệ thống kiểm soát phiên bản; ví dụ cvs diffsản xuất dòng tiêu đề đó trông giống như diff -r1.42 foo. Sau đó, không có tiền tố để dải, vì vậy bạn phải chỉ định -p0.

Trong trường hợp đặc biệt khi không có thư mục con trong các cây mà bạn đang so sánh, không có -ptùy chọn nào là cần thiết: patchsẽ loại bỏ tất cả phần thư mục của tên tệp. Nhưng hầu hết thời gian, bạn cần -p0hoặc -p1, tùy thuộc vào cách sản xuất bản vá.


Điều này đã làm tôi bối rối quá lâu. Tại sao hành vi của không có thư mục con khác với -p0? Tôi đã luôn cho rằng -p0 là mặc định, vì vậy tôi luôn gặp vấn đề nếu nó được coi là p0
Brydon Gibson

@BrydonGibson Tôi nghi ngờ rằng ban đầu ý tưởng là tác giả bản vá có thể viết một cách vô tư diff old/foo new/foo >my.patchhoặc diff ../old/foo foo >my.patchhoặc diff foo.old foo >my.patchngười dùng có thể áp dụng nó patch <my.patchmà không cần phải quan tâm làm thế nào bản vá được tạo ra, và sau đó -pđược thêm vào như một sự tiện lợi. Nhưng tôi thực sự không biết, patchlà một tiện ích cũ và đến khi tôi bắt đầu sử dụng nó -p0hoặc -p1đã là những cách phổ biến nhất để sử dụng nó.
Gilles 'SO- ngừng trở nên xấu xa'

16

Từ người đàn ông:

-pnum hoặc --strip=num Tách tiền tố nhỏ nhất có chứa dấu gạch chéo hàng đầu từ mỗi tên tệp được tìm thấy trong tệp vá. Một chuỗi gồm một hoặc nhiều dấu gạch chéo liền kề được tính là một dấu gạch chéo. Điều này kiểm soát cách xử lý tên tệp trong tệp vá, trong trường hợp bạn giữ các tệp của mình trong một thư mục khác với người đã gửi bản vá. Ví dụ: giả sử tên tệp trong tệp vá là:

 /u/howard/src/blurfl/blurfl.c

cài đặt -p0cung cấp cho toàn bộ tên tệp không thay đổi , -p1cung cấp cho

 u/howard/src/blurfl/blurfl.c

không có dấu gạch chéo hàng đầu , -p4cho

 blurfl/blurfl.c

4

Sự khác biệt là số sau -psẽ chỉ định số lượng thành phần đường dẫn sẽ bị xóa.

Nói rằng chúng ta có một con đường /Barack/Obama. Thực hiện một bản vá trên nó với -p0đối số sẽ xử lý đường dẫn như sau:

/Barack/Obama

Nhưng chúng ta có thể cắt đường dẫn trong khi vá:

-p1sẽ xóa dấu gạch chéo gốc (lưu ý rằng nó sẽ chỉ là Barack ngay bây giờ, không có dấu gạch chéo để lại):

Barack/Obama

-p2 sẽ loại bỏ Barack (và dấu gạch chéo bên phải):

 Obama

Để mở rộng "lý do" của patchhành vi này , hãy đọc chủ đề này .

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.