Câu trả lời:
Cách phổ biến nhất để tạo một bản vá là chạy diff
lệ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 diff
như 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 diff
hì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_version
hoặc new_version
) khỏi tên tệp. Đó là những gì -p1
có 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 diff
sả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ó -p
tùy chọn nào là cần thiết: patch
sẽ 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 -p0
hoặc -p1
, tùy thuộc vào cách sản xuất bản vá.
diff old/foo new/foo >my.patch
hoặc diff ../old/foo foo >my.patch
hoặc diff foo.old foo >my.patch
người dùng có thể áp dụng nó patch <my.patch
mà 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, patch
là một tiện ích cũ và đến khi tôi bắt đầu sử dụng nó -p0
hoặc -p1
đã là những cách phổ biến nhất để sử dụng nó.
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
-p0
cung cấp cho toàn bộ tên tệp không thay đổi ,-p1
cung cấp chou/howard/src/blurfl/blurfl.c
không có dấu gạch chéo hàng đầu ,
-p4
choblurfl/blurfl.c
Sự khác biệt là số sau -p
sẽ 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á:
-p1
sẽ 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 patch
hành vi này , hãy đọc chủ đề này .