내가 아는 한, patch
특정 경로 구성 요소가 제거되면 응용 프로그램 패치가 허용됩니다.
-p0
매개변수가 경로를 처리 하지만있는 그대로:
/var/www/html/example.com
-p1
루트 슬래시가 제거되므로 사용하는 경로는 다음과 같습니다.
var/www/html/example.com
전체 경로로 패치하는 대신 루트 슬래시(또는 경로의 이전 구성 요소)를 제거하는 이유는 무엇입니까?
상대 경로를 통해 디렉토리 트리를 심화시키는 논리를 볼 수 있지만 대부분의 경우 그것이 실용적이거나 유용한지 여부는 알 수 없습니다.
답변1
patch
이것POSIX 유틸리티입니다, 이 옵션의 사용 예는 유틸리티 표준 사양의 이론적 근거 섹션에 나와 있습니다 -p
.
이
-p
옵션을 사용하면 패치 파일을 수동으로 편집하지 않고도 로컬 사용자 디렉터리 구조에 맞게 패치 파일을 사용자 정의할 수 있습니다. 예를 들어, 패치 파일의 파일 이름이 다음과 같은 경우:/curds/whey/src/blurfl/blurfl.c
설정은
-p 0
수정되지 않은 전체 경로 이름을 제공합니다-p 1
.curds/whey/src/blurfl/blurfl.c
프리앰블 없이 다음을
<slash>
제공-p 4
합니다.blurfl/blurfl.c
-p를 전혀 지정하지 않으면 다음이 제공됩니다.
blurfl.c
이것OpenBSD 매뉴얼다음은 유용할 수 있는 유사하지만 약간 확장된 예입니다 -p
(강조).
-p strip-count
,--strip strip-count
패치 파일에 있는 경로 이름을 처리하는 방법을 제어하는 경로 이름 수를 설정합니다.패치를 보낸 사람과 다른 디렉터리에 파일을 저장한 경우. 제거 횟수는 경로 이름 앞에서 제거할 슬래시 수를 지정합니다. (중간에 있는 모든 디렉터리 이름도 사라집니다.) 예를 들어 패치 파일의 파일 이름이 다음과 같다고 가정합니다
/u/howard/src/blurfl/blurfl.c
.이 설정은
-p0
수정되지 않은 전체 경로 이름을 제공합니다.
-p1
주어진u/howard/src/blurfl/blurfl.c
앞에 슬래시가 없습니다.
-p4
주어진blurfl/blurfl.c
계속해서 다음과 같이 말합니다.
-p
이를 전혀 지정하지 않으면blurfl.c
선행 경로( )의 모든 디렉터리가u/howard/src/blurfl
존재하고 경로가 상대 경로가 아닌 경우에만 제공됩니다. 이 경우 전체 경로 이름이 수정되지 않은 상태로 표시됩니다. 결과적으로 무엇이든지 현재 디렉토리나 옵션에 지정된 디렉토리에서 검색됩니다-d
.
즉, 적용되는 파일에 대한 절대 경로가 포함된 패치를 얻고 해당 파일을 다른 디렉터리에 보관하는 경우 -p
적절한 번호를 사용하여 패치의 경로를 -d
(또는 현재 디렉터리) 로 "오프셋"할 수 있습니다. .
답변2
이것수리하다이 명령은 파일을 변경하는 방법에 대한 소스 파일의 지침을 읽은 다음 변경 사항을 적용합니다(예:자세한 내용은). 그리고 지나가다-pN플래그를 건너뛰었습니다.질소패치 파일에 있는 파일 이름의 앞에는 슬래시가 있습니다.
디렉토리 부분에 관한 내용입니다.차이점머리글. 귀하의 경우 diff 헤더에는 다음 문자열이 포함되어 있습니다 /var/www/html/example.com
. -p1 플래그를 사용하면 패치 유틸리티는 문자열 리더에서 디렉토리를 제거하고 var/www/html/example.com
패치하려는 디렉토리를 얻게 됩니다. -p0 매개변수를 사용하여 패치하면 문자열에서 아무것도 제거되지 않으며 올바르게 작동하지 않습니다.
예를 들어:
SSH2.xs 파일 패치를 올바르게 호출하려면(패치 파일은 다음 위치에 있습니다.rt.cpan.org/Public/Bug/Display.html?id=36614):
patch -p1 < net-ssh2-0.18-perl5.10.patch
패치 파일에는 패치 이전에 삭제한 디렉터리가 포함되어 있으며 Net-SSH-0.18.orig
, SSH2.x2 파일이 위치한 디렉터리에서 위의 작업을 실행해야 합니다.