Linux에서 파일에 패치를 적용하고 패치를 만드는 방법

Linux patch명령을 사용하면 한 파일 집합에서 다른 파일 집합으로 변경 사항을 빠르고 안전하게 전송할 수 있습니다. patch간단한 방법 을 사용 하는 방법을 알아보십시오 .

패치 및 diff 명령

컴퓨터에 텍스트 파일이 있다고 상상해보십시오. 다른 사람으로부터 해당 텍스트 파일의 수정 된 버전을받습니다. 수정 된 파일의 모든 변경 사항을 원본 파일로 빠르게 전송하는 방법은 무엇입니까? 그건 어디 patchdiff놀이로 온다. patch그리고 diff리눅스 및 맥 OS 등 다른 유닉스 운영 체제에서 발견된다.

diff명령은 파일의 두 가지 버전을 검사하고 그 차이점을 나열합니다. 차이점은 패치 파일이라는 파일에 저장할 수 있습니다.

이  patch 명령은 패치 파일을 읽고 내용을 일련의 지침으로 사용할 수 있습니다. 이러한 지침을 따르면 수정 된 파일의 변경 사항이 원본 파일에 복제됩니다.

이제 텍스트 파일의 전체 디렉토리에서 발생하는 프로세스를 상상해보십시오. 한 번에 모두. 그것이 patch.

때로는 수정 된 파일이 전송되지 않습니다. 전송되는 것은 패치 파일뿐입니다. 하나의 파일을 보내거나 쉽게 다운로드 할 수 있도록 하나의 파일을 게시 할 수 있는데 수십 개의 파일을 라운드로 보내는 이유는 무엇입니까?

실제로 파일을 패치하기 위해 패치 파일로 무엇을합니까? 거의 혀를 꼬집는 것 외에도 좋은 질문입니다. 이 기사에서 자세히 살펴 보겠습니다.

patch명령은 소프트웨어 소스 코드 파일로 작업하는 사람들이 가장 자주 사용하지만 목적, 소스 코드 여부에 관계없이 모든 텍스트 파일 세트와 똑같이 잘 작동합니다.

관련 : Linux 터미널에서 두 개의 텍스트 파일을 비교하는 방법

예제 시나리오

이 시나리오에서 우리는 두 개의 다른 디렉토리를 포함하는 work라는 디렉토리에 있습니다. 하나는 working 이라고 하고 다른 하나는 latest 라고 합니다. 작업 디렉토리에는 소스 코드 파일 세트가 있습니다. 최신 디렉토리에는 일부 수정 된 소스 코드 파일의 최신 버전이 포함됩니다.

안전을 위해 작업 디렉토리는 현재 버전의 텍스트 파일 사본입니다. 그것들의 유일한 사본이 아닙니다.

두 버전의 파일 차이점 찾기

diff명령은 두 파일 간의 차이점을 찾습니다. 기본 동작은 터미널 창에 수정 된 줄을 나열하는 것입니다.

하나의 파일은 slang.c. 작업 디렉토리의 버전을 최신 디렉토리의 버전과 비교할 것입니다.

-u (통합) 옵션을 알려줍니다 diff또한 이전과 변화의 각 섹션 후에서 해제 수정 텍스트 라인의 일부를 나열합니다. 이러한 라인을 컨텍스트 라인이라고합니다. patch 명령이 원본 파일에서 변경해야하는 위치를 정확하게 찾는 데 도움이  됩니다.

diff비교할 파일을 알 수 있도록 파일 이름을 제공합니다 . 원본 파일이 먼저 나열된 다음 수정 된 파일이 나열됩니다. 이것은 우리가 발행하는 명령입니다 diff.

diff -u working / slang.c latest / slang.c

diff파일 간의 차이점을 보여주는 출력 목록을 생성합니다. 파일이 동일하면 출력이 전혀 나열되지 않습니다. 이러한 유형의 출력을 보면 diff두 파일 버전간에 차이가 있고 원본 파일에 패치가 필요함을 확인할 수 있습니다.

패치 파일 만들기

패치 파일에서 이러한 차이점을 캡처하려면 다음 명령을 사용하십시오. 위와 동일한 명령으로 출력이 diffslang.patch라는 파일로 리디렉션됩니다.

diff -u working / slang.c latest / slang.c> slang.patch

패치 파일의 이름은 임의적입니다. 원하는대로 부를 수 있습니다. ".patch"확장자를 지정하는 것은 좋은 생각입니다. 그러나 그것이 어떤 유형의 파일인지 명확하게 보여줍니다.

하려면  patch패치 파일에 따라 행동 및 작업 / slang.c 파일을 수정, 다음 명령을 사용합니다. -u(통합) 옵션은 할 수 patch 패치 파일이 통합 컨텍스트 줄이 포함되어 있음을 알고있다. 우리가 사용할 수 있도록 즉, 우리는 DIFF에 -u 옵션을 사용 -u으로 옵션을 patch.

patch -u working.slang.c -i slang.patch

모든 것이 잘되면 patch파일을 패치하고 있음을 알리는 한 줄의 출력 이 있습니다.

원본 파일의 백업 만들기

(backup) 옵션 patch을 사용하여 변경되기 전에 패치 된 파일의 백업 복사본을 만들도록 지시 할 수  -b있습니다. -i(입력) 옵션을 사용하여 패치 파일의 이름을 패치 말한다 :

 patch -u -b working.slang.c -i slang.patch 

파일은 출력에 눈에 띄는 차이없이 이전과 같이 패치됩니다. 그러나 작업 폴더를 살펴보면 slang.c.orig라는 파일이 생성 된 것을 볼 수 있습니다. 파일의 날짜 및 시간 스탬프는 slang.c.orig가 원본 파일이고 slang.c가 patch.

디렉토리와 함께 diff 사용

diff두 디렉터리에있는 파일 간의 모든 차이점을 포함하는 패치 파일을 만드는 데 사용할 수 있습니다 . 그런 다음 해당 패치 파일을 사용 patch하여 단일 명령으로 작업 폴더의 파일에 이러한 차이점을 적용 할 수 있습니다.

우리가 사용하는거야 옵션은 diff있습니다 -u우리가 이전에 사용했다 (통합 환경) 선택에 따라 -r메이크업의에 (재귀) 옵션 diff하위 디렉토리와 조사 -N(새 파일) 옵션을 선택합니다.

-N옵션은 diff 작업 디렉토리에없는 최신 디렉토리의 파일을 처리하는 방법을 알려줍니다 .  최신 디렉토리에 있지만 작업 디렉토리에는없는 파일을 생성 diff하도록 패치 파일에 명령을 강제 로 넣습니다 patch.

단일 하이픈 ( -) 을 사용하도록 옵션을 함께 묶을 수 있습니다 .

우리는 디렉토리 이름 만 제공하고 diff특정 파일을 보도록 지시 하지 않습니다 .

diff -ruN working / latest /> slang.patch

패치 파일 내부 엿보기

패치 파일을 간단히 살펴 보겠습니다. less내용을 살펴볼 때 사용 합니다.

파일 상단에는 slang.c의 두 버전 간의 차이점이 표시됩니다.

패치 파일을 더 아래로 스크롤하면 structs.h라는 다른 파일의 변경 사항을 설명하는 것을 볼 수 있습니다. 이는 패치 파일에 여러 파일의 서로 다른 버전 간의 차이점이 확실히 포함되어 있는지 확인합니다.

도약하기 전에보세요

대규모 파일 컬렉션을 패치하는 것은 약간 불편할 수 있으므로 급격히 --dry-run 변경하고 변경하기 전에 모든 것이 정상인지 확인 하는 옵션을 사용할 것입니다.

--dry-run옵션은 patch실제로 파일을 수정하는 것 외에 모든 것을 수행하도록 지시 합니다. patch파일에 대한 모든 사전 검사를 수행하고 문제가 발생하면보고합니다. 어느 쪽이든 파일이 수정되지 않습니다.

문제가보고되지 않으면 --dry-run옵션 없이 명령을 반복 하고 자신있게 파일을 패치 할 수 있습니다.

-d(디렉토리) 옵션은 말 patch에 작업 할 디렉토리를.

우리가 있다는 것을 참고 하지 사용하는 -i말 (입력) 옵션 patch에서 지침을 포함하는 패치 파일 diff. 대신, 우리는에 패치 파일을 리디렉션하고 patch<.

patch --dry-run -ruN -d working <slang.patch

전체 디렉토리에서 diff패치 할 파일 두 개를 찾았습니다. 이 두 파일의 수정 사항에 대한 지침은에서 확인했으며 patch 보고 된 문제는 없습니다.

비행 전 검사는 괜찮습니다. 이륙 할 준비가되었습니다.

디렉토리 패치

진정으로 파일에 패치를 적용하려면 --dry-run옵션 없이 이전 명령을 사용합니다 .

patch -ruN -d working <slang.patch

이번에는 각 출력 라인이 "checking"으로 시작하지 않고 각 라인이 "patching"으로 시작합니다.

그리고 문제는보고되지 않습니다. 소스 코드를 컴파일하면 최신 버전의 소프트웨어를 사용할 수 있습니다.

차이를 해결하십시오

이것은 사용하는 가장 쉽고 안전한 방법 patch입니다. 대상 파일을 폴더에 복사하고 해당 폴더를 패치하십시오. 패치 프로세스가 오류없이 완료되면 다시 복사하십시오.