패치를 되 돌리면 항상 패치가 완전히 적용되었음을 의미합니까?


9

이 문제는 ' 파일이나 폴더가 이미 패치되었는지 확인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

1
@roamia 잘 패치와 스크립트는 내 통제하에 있습니다. 내 스크립트 만 패치를 적용합니다.
Jay

나는 전진과 후진 모두에서 완전히 성공할 출발점과 패치를 고안하는 것이 가능하다고 생각합니다.
Jasen

답변:


3

이 차이점으로 :

diff --git a/bar b/bar
new file mode 100644
index 0000000..e69de29
diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo

이것은 일어난다 :

$ cd /tmp/test
$ patch --forward -i foobar.patch
patching file bar
patching file foo
$ echo $?
0
$ rm bar
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file bar,
which does not exist!  Applying it anyway.
checking file bar
checking file foo
$ echo $?
0

따라서 귀하의 질문에 대한 대답은 아니오입니다.


지적 해 주셔서 감사합니다. --posix패치 할 파일이 없을 때 오류가 발생하므로 사용하여 해당 사례를 해결할 수 있습니다 . 그러나 POSIX 모드를 사용하면 삭제할 파일에 패치와 다른 내용이 포함 된 경우 오류가 설정되지 않습니다. 예를 들어 리버스 명령을 실행 --posix하고 막대 파일에 일부 데이터가 포함되어 있으면 POSIX 모드에서 파일이 삭제되지 않고 오류가 발생하지 않습니다. 따라서 내 수정은 posix 모드 유무에 관계없이 실행되며 둘 다 정상이면 패치가 성공적으로 적용된 것으로 가정합니다. 이를 반영하여 질문을 업데이트하겠습니다.
Jay

나타납니다 --posix치료 - 모든 나는 그것이라고 생각하지 않을 수 있습니다. 패치로 파일을 삭제하고 실행 --posix --reverse하면 파일이 존재하지 않는다는 오류가 발생합니다. 내일 좀 더 살펴 봐야 겠어
Jay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.