답변:
패치를 작성하는 가장 일반적인 방법은 diff
명령 또는 일부 버전 제어의 내장 diff
유사 명령을 실행하는 것입니다. 때로는 두 파일 만 비교하고 다음 diff
과 같이 실행 합니다.
diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
그런 다음 한 파일에 대한 변경 사항이 포함되어 있고 파일 이름이 전혀없는 패치가 제공됩니다. 해당 패치를 적용 할 때 적용 할 파일을 지정해야합니다.
patch <alice_to_bob.patch version2_by_alice.txt
종종 디렉토리에 포함 된 전체 다중 파일 프로젝트의 두 가지 버전을 비교합니다. 일반적인 호출은 diff
다음과 같습니다.
diff -ru old_version new_version >some.patch
그런 다음 패치에는 헤더 행에 지정된 파일 이름이 포함됩니다 diff -ru old_version/dir/file new_version/dir/file
. 파일 이름에서 patch
접두사 ( old_version
또는 new_version
) 를 제거하도록 지시 해야합니다 . 이것이 -p1
의미 하는 바 는 한 수준의 디렉토리를 제거하는 것입니다.
경우에 따라 패치의 헤더 행에 파일 이름없이 직접 파일 이름이 포함됩니다. 이것은 버전 관리 시스템에서 일반적입니다. 예를 들어 cvs diff
다음과 같은 헤더 행을 생성합니다 diff -r1.42 foo
. 그런 다음 제거 할 접두사가 없으므로을 지정해야합니다 -p0
.
비교할 트리에 하위 디렉토리가없는 특별한 경우에는 -p
옵션이 필요 하지 않습니다 patch
. 파일 이름의 모든 디렉토리 부분을 버립니다. 그러나 대부분의 시간, 당신도 필요합니까 -p0
또는 -p1
패치가 제조 된 방법에 따라.
diff old/foo new/foo >my.patch
하거나 diff ../old/foo foo >my.patch
또는 diff foo.old foo >my.patch
사용자가 그것을 적용 할 수있는 patch <my.patch
패치를 제작 한 후, 어떻게 걱정 할 필요없이 -p
편의 추가되었습니다. 그러나 나는 실제로 모른다, patch
구식 유틸리티이며, 사용하기 시작했을 때 -p0
또는 -p1
이미 가장 일반적인 방법이었습니다.
남자에게서 :
-pnum
또는--strip=num
패치 파일에있는 각 파일 이름에서 선행 슬래시가 포함 된 가장 작은 접두사를 제거하십시오. 하나 이상의 인접한 슬래시 시퀀스는 단일 슬래시로 계산됩니다. 패치를 보낸 사람과 다른 디렉토리에 파일을 보관할 경우 패치 파일에서 찾은 파일 이름을 처리하는 방법을 제어합니다. 예를 들어 패치 파일의 파일 이름이 다음과 같다고 가정합니다./u/howard/src/blurfl/blurfl.c
설정은
-p0
수정되지 않은 전체 파일 이름을 제공 ,-p1
제공u/howard/src/blurfl/blurfl.c
최고의 슬래시없이 ,
-p4
제공blurfl/blurfl.c
차이점은 이후 -p
의 숫자는 제거 될 경로 구성 요소의 수를 지정한다는 것입니다.
경로가 있다고 가정 해 봅시다 /Barack/Obama
. -p0
인수 로 패치를 실행 하면 경로를 그대로 취급합니다 .
/Barack/Obama
그러나 패치하는 동안 경로를 다듬을 수 있습니다.
-p1
루트 슬래시 를 제거합니다 (슬래시가 남지 않고 지금은 Barack이됩니다).
Barack/Obama
-p2
Barack (및 인접한 오른쪽 슬래시)을 제거합니다.
Obama
이 patch
동작 의 "이유"를 확장하려면 이 스레드를 읽으십시오 .