패치를 적용하기 전에 파일이 패치되었는지 알 수 있습니까?
스크립트에서 이 작업을 수행해야 합니다. 어떤 아이디어가 있습니까?
답변1
예, 옵션을 patch
사용하여 실행 --dry-run
하면 실패하거나 성공하며 종료 상태로 확인할 수 있습니다.
하지만 좀 더 일반적인(그리고 오류가 덜 발생하는) 방식으로-R
, 전체 패치를 복원할 수 있는 경우에만 "적용"된 것으로 간주될 수 있으므로 "역방향"을 의미하는 옵션을 사용하여 실행 해야 할 수도 있습니다 . 그렇지 않으면("-R" 없이) 원본 파일의 일부가 변경되어 실패할 수 있습니다. 간단한 예는 다음과 같습니다.
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
patch
( stdout 및 stderr을 위의 코드 조각으로 리디렉션하여 완전히 침묵하는 것을 선호할 수도 있습니다 /dev/null
)
답변2
누군가에게 도움이 될 경우를 대비해 Omnifarious에서 제공한 예제는 bash 스크립트를 사용하는 경우 작동하지 않습니다. 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
답변3
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
답변4
이것은 나에게 효과적입니다.
"scripts": {
"symfony-scripts": [
"patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",