Kiểm tra xem một tập tin hoặc thư mục đã được vá


22

Có thể biết nếu một tập tin đã được vá, trước khi áp dụng các bản vá?

Tôi cần phải làm điều này trong một kịch bản, bất kỳ suy nghĩ?


1
Bạn đang sử dụng chương trình gì để vá chúng? Những loại bản vá?
Omnifarious 15/11 '

1
Chìa khóa là "-R" - unix.stackexchange.com/a/86872/6622
poige

Câu trả lời:


20

Đúng, chỉ cần chạy patchvới --dry-runtùy chọn, nó sẽ thất bại hoặc thành công có thể được tìm thấy với trạng thái thoát của nó.

Nhưng theo cách phổ biến hơn (và dễ bị lỗi) , bạn có thể phải chạy nó với -Rtùy chọn có nghĩa là "đảo ngược" vì chỉ khi nó có thể hoàn nguyên toàn bộ bản vá thì nó mới có thể được coi là "áp dụng". Mặt khác (không có '-R'), nó có thể bị lỗi chỉ do một số phần của tệp gốc đã bị thay đổi. Dưới đây là một ví dụ đơn giản:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(Hơn nữa, trong đoạn trích ở trên, bạn thậm chí có thể thích im lặng patchhoàn toàn chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn của nó /dev/null)


1
Điều này không làm việc cho tôi. Khi tôi chạy lệnh đó, nếu bản vá chưa được áp dụng, nó sẽ hỏi liệu có "đảo ngược" bản vá trong chế độ tương tác hay không, và nếu tôi sử dụng chế độ hàng loạt, nó sẽ bỏ qua thao tác ngược lại và áp dụng bản vá, trả về 0.
đồng bộ

1
Này, hãy thử thêm -sfvào patch(có thể được viết là patch -Rsfp0 --dry-run)
poige

1
@synack đã đi được chưa?
poige

16

Chỉ trong trường hợp nó giúp được ai đó, nếu bạn đang sử dụng tập lệnh bash thì ví dụ được đưa ra bởi Omnifarious sẽ không hoạt động. Trong bash trạng thái thoát của lệnh thành công là 0

Vì vậy, sau đây sẽ làm việc:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi

Việc kiểm tra phải chống lại 1thay vì 0:if [ $? -eq 1 ]
Crisson

2
Không, 0 là chính xác. Bản vá sẽ thoát với giá trị khác không nếu chạy khô không thành công vì một số lý do, trong trường hợp đó, bản vá không nên được áp dụng.
Fls'Zen

Kịch bản của tôi đã đúng trong bash. bash coi mã thoát là 0 truecho mục đích if. Chính xác bởi vì hầu hết các lệnh sử dụng mã thoát là 0 để biểu thị thành công.
Omnifarious

2

Đây là một phỏng đoán, giả sử rằng bạn đang sử dụng patchtiện ích và mỗi tệp được vá có bản vá riêng:

if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi

Hoặc, nếu bạn đã vá các tệp trước đó và muốn biết, liệu nó có chạm vào một số tệp cụ thể hay không, bạn có thể chạy vòng vá đầu tiên với -Btùy chọn, điều này sẽ khiến việc sao lưu được thực hiện. Sau đó, bạn kiểm tra sự tồn tại của bản sao lưu.
peterph

8
Bạn có thể mở rộng một chút về lý do tại sao bạn chọn sử dụng nohuptrong iftrường hợp đó?
zrajm

@zrajm - Tôi không thể nhớ tại sao tôi lại làm vậy. Và vào thời điểm tôi nhận thấy (vì yêu cầu phê duyệt chỉnh sửa) rằng nó đã ở đó, đã rất lâu rồi tôi không bao giờ lấy lại được lý do. Nó dường như khá vô nghĩa đối với tôi nhìn vào nó bây giờ.
Omnifarious

0

Trong trường hợp của tôi, tôi muốn thực hiện kiểm tra đó để chạy lệnh vá sẽ không kết thúc với một thiết bị đầu cuối tương tác hỏi phải làm gì (đặc biệt là đối với CI).

Hóa ra nếu bạn chỉ cần bạn cũng có thể sử dụng --forwardđối số và nó sẽ bỏ qua bản vá nếu đã được áp dụng!


0

Điều này làm việc với tôi.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
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.