Linux에서 파일에 패치를 적용하고 패치를 만드는 방법
Linux patch
명령을 사용하면 한 파일 집합에서 다른 파일 집합으로 변경 사항을 빠르고 안전하게 전송할 수 있습니다. patch
간단한 방법 을 사용 하는 방법을 알아보십시오 .
패치 및 diff 명령
컴퓨터에 텍스트 파일이 있다고 상상해보십시오. 다른 사람으로부터 해당 텍스트 파일의 수정 된 버전을받습니다. 수정 된 파일의 모든 변경 사항을 원본 파일로 빠르게 전송하는 방법은 무엇입니까? 그건 어디 patch
와 diff
놀이로 온다. 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
두 파일 버전간에 차이가 있고 원본 파일에 패치가 필요함을 확인할 수 있습니다.
패치 파일 만들기
패치 파일에서 이러한 차이점을 캡처하려면 다음 명령을 사용하십시오. 위와 동일한 명령으로 출력이 diff
slang.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
입니다. 대상 파일을 폴더에 복사하고 해당 폴더를 패치하십시오. 패치 프로세스가 오류없이 완료되면 다시 복사하십시오.