파일 또는 폴더가 이미 패치되었는지 확인 적용하기 전에 파일이 이미 패치되었는지 알

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

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



답변

네, 바로 실행 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)


답변

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


답변

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


답변

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

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


답변

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

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


답변