파일 또는 폴더가 이미 패치되었는지 확인


22

패치를 적용하기 전에 파일이 이미 패치되었는지 알 수 있습니까?

나는 생각을 스크립트로해야합니까?


1
패치를 위해 어떤 프로그램을 사용하고 있습니까? 어떤 종류의 패치?
Omnifarious

답변:


20

네, 바로 실행 patch--dry-run옵션이 하나 실패 또는 종료 상태로 발견 할 수있는 성공.

그러나보다 일반적인 (그리고 오류가 발생하기 쉬운) 방법으로 , -R전체 패치를 되돌릴 수있는 경우에만 "적용됨"으로 간주 될 수 있기 때문에 "reverse"를 의미 하는 옵션 으로 실행해야합니다 . 그렇지 않으면 ( '-R'없이) 원본 파일의 일부가 변경되어 실패 할 수 있습니다. 아래는 간단한 예입니다.

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

(또한 위의 스 니펫 patch에서는 stdout 및 stderr을 완전히 리디렉션 하여 침묵시키는 것을 선호 할 수도 있습니다 /dev/null)


1
이것은 나를 위해 작동하지 않습니다. 해당 명령을 실행할 때 패치가 적용되지 않은 경우 대화식 모드에서 패치를 '역방향으로 되돌릴 것인지'를 묻고 배치 모드를 사용하면 역 동작을 무시하고 패치를 적용하여 0을 반환합니다.
synack

1
이봐, 추가 시도 -sfpatch(같이 쓸 수있다 patch -Rsfp0 --dry-run)
poige

1
@synack 괜찮 았어?
poige

16

bash 스크립트를 사용하는 경우 누군가에게 도움이되는 경우 Omnifarious의 예제는 작동하지 않습니다. bash에서 성공적인 명령의 종료 상태는 0입니다.

따라서 다음과 같이 작동합니다.

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

점검 1대신에 반대해야합니다 0:if [ $? -eq 1 ]
크리스 슨

2
아니요, 0이 맞습니다. 어떤 이유로 드라이 런이 실패하면 패치가 0이 아닌 상태로 종료됩니다.이 경우 패치를 적용해서는 안됩니다.
Fls'Zen

내 스크립트는 bash에서 정확했습니다. bash는 종료 코드 0을 trueif의 목적으로 간주합니다 . 정확하게는 대부분의 명령이 성공을 나타 내기 위해 종료 코드 0을 사용하기 때문입니다.
Omnifarious

2

patch유틸리티를 사용 중이고 패치 할 각 파일에 자체 패치가 있다고 가정하면 다음과 같습니다 .

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

또는 파일을 패치 한 후 특정 파일에 닿았는지 여부를 알고 싶은 경우 -B옵션을 사용하여 첫 번째 패치 라운드를 실행 하면 백업이 수행 될 수 있습니다. 그런 다음 백업이 있는지 확인합니다.
peterph

8
nohupif경우 에 사용하기로 선택한 이유를 조금 더 설명해 주 시겠습니까?
zrajm

@zrajm-왜 그렇게했는지 기억이 안납니다. 그리고 내가 편집 승인 요청으로 인해 요청이 있음을 알았을 때, 너무 오래 전에 내가 그 이유를 회복 할 기회는 없었습니다. 지금보고있는 것이 무의미 해 보입니다.
Omnifarious

0

필자의 경우 패치 명령을 실행하면 대화식 터미널로 끝나지 않아서 (특히 CI의 경우) 무엇을해야하는지 확인하고 싶었습니다.

필요한 경우에만 --forward인수를 사용할 수 있으며 이미 적용된 경우 패치를 건너 뜁니다.


0

이것은 나에게 효과가 있었다.

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.