댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
LINUX
2012.10.22 09:34
패치 파일 만들기와 적용하기 (patch, diff)
조회 수 38400 댓글 2
패치 파일 만들기와 적용하기 (patch, diff) 패치(patch) 파일은 두 파일들 간의 차이를 출력해 주는 프로그램인 diff에 의해 생성된 파일을 의미한다. 주로 쓰이는 때는 어떤 프로그램에서 기능 향상이나 문제점을 해결하기 위해 소스 파일들을 고치고 나서 고친 부분에 대한 정보만을 기록해 놓고 싶은 경우 사용한다. 고친 소스 파일 전체보다도 고친 부분에 대한 정보만을 갖고 있으면 저장해야 하는 양이 적고, 어떤 부분을 고쳤는지 파악하기도 쉽다는 장점이 있다(특히 비공식적인 패치 적용시 프로그램이 버전 업이 되어 소스가 변경되었을 경우 유용하다). 패치 파일의 확장자는 사용자 임의이긴 하지만 알아보기 쉽도록 주로 .diff 또는 .patch를 사용한다. 그럼 먼저 패치 파일을 만들기 위해 diff 프로그램의 사용법을 익혀본다. 다음은 두 파일의 차이를 기록해 두기 위해 diff를 사용하는 간단한 예이다. 다음과 같이 hello라는 문구를 출력하는 hello.c라는 파일을 만들었다고 하자.
위에서 printf 문안에 출력될 'hello'라는 문구 대신 'hi'로 바꾸고 싶다면, 우선 다음과 같이 hello.c 파일을 hello.c_org 라는 파일로 백업한다. 그리고나서 hello.c를 다음과 같이 수정한다.
두 파일(hello.c/hello.c_org)의 차이점을 패치 파일로 기록해 두기 위해 다음과 같이 diff 명령을 이용한다.
[표 3.29]는 diff 명령어의 옵션을 설명한다.
뒤에 오는 인수로서 앞에 있는 hello.c_org는 고치기 전의 원래 파일명, 뒤의 hello.c는 고친 후의 파일명을 써준다. 그리고 diff는 그 출력이 standard output이기 때문에 이것을 hello-hi.patch라는 패치 파일에 저장하기 위해 파이프를 이용하였다. hello-hi.patch 파일의 내용은 다음과 같다. [그림 3.80] hello-hi.patch 파일 내용 [그림 3.80]에서는 원본의 파일과 내용은 -로 표시되고 수정된 파일과 내용은 +로 표시되는 것을 볼 수 있다. 지금까지 diff 명령어를 이용하여 패치(patch) 파일을 만들었다. 이제 만들어진 패치 파일을 적용하는 방법에 대해 알아보자. 패치는 다음과 같이 한다.
위에서 옵션 -p1은 현재 디렉토리에서 볼 때 한 단계 상위 디렉토리에 있는 파일에 패치를 적용하기 위한 것이고 -p0는 현재 디렉토리에 있는 파일에 패치를 적용하기 위한 것이다. 만약 프로그램 버전이 업그레이드 되었는데 패치 파일은 그 전 버전의 소스에서 만들어졌을 때 패치를 적용하면 어떻게 될 것인가? 운이 좋아서 바뀐 부분의 근처에 별로 바뀐 점이 없다면 그대로 적용된다. 만약 아니라면, reject한다는 에러 메시지를 만나게 될 것이다. 따라서 기능개선이나 버그를 개선하는 패치를 만든 경우 개발자에게 전달해서 다음 버전에는 적용되도록 하는 것이 좋다. 또한 패치 파일이 여러 개일 경우에는 패치를 적용하는 순서에 주의하여 패치를 해야 한다. 참고로 어떤 한 프로그램에 대한 패치가 여럿인 경우 그 파일명만을 보고 무엇을 하는 패치인지 파악할 수 있다면 좋을 것이다. 따라서 패치의 이름은 ‘프로그램 이름-버전-역할.patch' 정도로 할 것을 권한다.
Dreamy의 코드 스크랩내가 모으고 내가 보는
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
복잡해서 요약.
<.patch 만들기>
diff -uNr [원본파일 또는 경로] [수정파일 또는 경로] > [패치파일명]
ex) a.cpp를 b.cpp로 수정한후 b.patch를 생성
diff -uNr a.cpp b.cpp > b.patch
<patch 적용하기>
patch [옵션] [원본파일] [패치파일]
ex) b.patch를 a.cpp에 적용하려면
patch a.cpp b.patch