이 문제는 ' 파일이나 폴더가 이미 패치되었는지 확인patch
'과 ' 이미 적용된 패치를 건너 뛸 때 0을 반환 합니다 '라는 두 가지 질문으로 이루어 졌지만 만족스러운 답변은 없었습니다.
스크립트를 작성 중이며 다음 패치를 테스트하고 싶습니다.
완전히 적용 : 계속
부분적으로 적용 : 종료
적용되지 않음 : 성공적으로 적용될 수있는 경우 계속하고, 그렇지 않으면 종료
문제는 부분적으로 적용된 사례를 처리하는 것입니다.
mkdir test && cd test
cat << EOF > foobar.patch
--- /dev/null
+++ foo
@@ -0,0 +1 @@
+foo
--- /dev/null
+++ bar
@@ -0,0 +1 @@
+bar
EOF
patch --forward -i foobar.patch
rm foo
그래서 bar는 존재하지만 foo는 언젠가는 제거 되었기 때문에 그렇지 않습니다. 이제 드라이 런에서 패치를 적용하면 종료 코드가 1로 적용되지 않기 때문에 종료 코드가 1입니다.
$ patch --dry-run --forward --force -i foobar.patch
checking file foo
The next patch would create the file bar,
which already exists! Skipping patch.
1 out of 1 hunk ignored
$ echo $?
1
그래도 패치가 완전히 적용되었는지 여부는 알 수 없으며 드라이 런이 실패한 것입니다. 왜 이것이 stackoverflow 답변으로 올바른지 모르겠습니다. 나는 반전을 시도했지만 비 대화 형 스크립트이기 때문에 강제로 만 작동했습니다.
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file foo,
which does not exist! Applying it anyway.
checking file foo
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED
checking file bar
$ echo $?
1
따라서 드라이 런에서 패치를 강제로 되돌리려 고 할 때 패치가 완전히 적용되고 성공하지 못하면 패치가 완전히 적용되지 않거나 전혀 적용되지 않는 경우가 항상 있습니다. 그렇다면 나는 다음과 같은 것을 할 수 있기 때문에
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1
소스 코드가 사용자의 통제하에 있습니까? 즉, 모든 패치가 항상 정확히 한 번만 적용되도록 보장 할 수 있습니까?
—
roaima
@roamia 잘 패치와 스크립트는 내 통제하에 있습니다. 내 스크립트 만 패치를 적용합니다.
—
Jay
나는 전진과 후진 모두에서 완전히 성공할 출발점과 패치를 고안하는 것이 가능하다고 생각합니다.
—
Jasen