diff 를 이용한 리눅스 패치 파일 만들기

리눅스에서 어떤 소스를 수정하고 그 수정한 부분만을 따로 뽑아 두고 싶을 경우가 있다. 예를 들면, 오픈소스 프로젝트에 참여하여 자기가 수정한 부분만 뽑아 패치 파일로 만들어 배포하거나 하는 방식인데 그런 파일을 만드는 방법을 소개하겠다.

diff 명령어는 두 개의 파일을 비교하는 것이다. 이 명령어를 사용하여 패치 파일을 만든다.

$diff -urN ori.c cpy.c > pat.diff

이렇게 하면 pat.diff 라는 패치 파일이 만들어 진다. 확장자는 아무거나 사용하여도 상관 없으나 관례상 .diff 나 .patch를 사용한다고 한다.

옵션에 대한 것은 다음과 같다.
===========================================================================
-u 옵션은 “unified format”을 뜻하는 것으로, diff 포맷을 지정할 때 씁니다. -u 말고 -c라고
해서 “context format”도 있는데, 두 개가 모양이 다릅니다. -u를 주었을 때, -c를 주었을 때, 또는 아무 것도
안주었을 때 결과를 살펴 보면 포맷간의 차이를 쉽게 알 수 있습니다. 어느 것을 선택할지는 순전히 개인 취향의 문제입니다.
나중에 패치를 적용할 때 쓸 patch 프로그램은 세가지 포맷 모두를 자동 인식합니다. 그러나 오픈 소스 개발자중 대부분은 가장
알아보기 쉬운 unified format을 주로 씁니다.

-r은 경로로 지정한 디렉토리 안의 서브디렉토리를 전부 거슬러 들어가면서(recursive) 안에 있는 파일을 전부 비교하란 뜻입니다. 이걸 지정하지 않으면 명령행에서 지정한 디렉토리만 비교합니다.

-N 옵션은 새 파일도 diff에 포함하란 뜻입니다. 내가 고친 디렉토리에 새로 만들어 넣은 파일이 있을 경우 이걸 꼭 써야 합니다.

===========================================================================

실제 만들어진 패치를 적용하는 방법은 다음과 같다.

$patch -p1 < pat.diff

여기서 p1 옵션은 현재 patch 파일이 존재하는 디렉토리의 내용에 패치하라는 것이다. 즉, p1은 지금 있는 디렉토리 한단계 위로 가서 거기에 패치를 하라는 것이고 p0는 올라가지 말고 여기에 하라는 의미다. 쉽게 패치 파일을 패치 할 디렉토리 안에 두고 p1으로 패치하는 것이 가장 편할 것이다.

참고자료
http://wiki.kldp.org/wiki.php/DiffAndPatch

Leave a Reply