조회 수 37850 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

패치 파일 만들기와 적용하기 (patch, diff)

패치(patch) 파일은 두 파일들 간의 차이를 출력해 주는 프로그램인 diff에 의해 생성된 파일을 의미한다. 주로 쓰이는 때는 어떤 프로그램에서 기능 향상이나 문제점을 해결하기 위해 소스 파일들을 고치고 나서 고친 부분에 대한 정보만을 기록해 놓고 싶은 경우 사용한다. 고친 소스 파일 전체보다도 고친 부분에 대한 정보만을 갖고 있으면 저장해야 하는 양이 적고, 어떤 부분을 고쳤는지 파악하기도 쉽다는 장점이 있다(특히 비공식적인 패치 적용시 프로그램이 버전 업이 되어 소스가 변경되었을 경우 유용하다). 패치 파일의 확장자는 사용자 임의이긴 하지만 알아보기 쉽도록 주로 .diff 또는 .patch를 사용한다. 그럼 먼저 패치 파일을 만들기 위해 diff 프로그램의 사용법을 익혀본다.

다음은 두 파일의 차이를 기록해 두기 위해 diff를 사용하는 간단한 예이다. 다음과 같이 hello라는 문구를 출력하는 hello.c라는 파일을 만들었다고 하자.

 

 

#include <stdio.h>

int main()

{

printf("hello\n");

return 0;

}

 

 

위에서 printf 문안에 출력될 'hello'라는 문구 대신 'hi'로 바꾸고 싶다면, 우선 다음과 같이 hello.c 파일을 hello.c_org 라는 파일로 백업한다. 그리고나서 hello.c를 다음과 같이 수정한다.

 

 

# cp hello.c hello.c_org

#include <stdio.h>

int main()

{

printf("hi\n");

return 0;

}

 

두 파일(hello.c/hello.c_org)의 차이점을 패치 파일로 기록해 두기 위해 다음과 같이 diff 명령을 이용한다.

 

 

# diff [옵션] [소스파일] [타깃파일]

# diff -uNr hello.c_org hello.c > hello-hi.patch

[ 3.29] diff 명령어의 옵션을 설명한다.

 

옵션

설명

-u

통일된 출력 포맷을 사용한다. 디렉토리를 비교할 때, 두 개의 디렉토리 중 두 번째 디렉토리에만 파일이 존재한다면, 첫 번째 디렉토리에는 사실 파일이 없지만 있는 것처럼 처리한다.

-N

비교하는 디렉토리에 파일이 하나의 디렉토리에만 있다면, 모두 있는 것처럼 처리를 하지만 사실은 다른 한 디렉토리에는 파일이 없다.

-r

두 디렉토리를 비교할 때, 모든 서브 디렉토리는 재귀적으로 비교한다.

[ 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) 파일을 만들었다. 이제 만들어진 패치 파일을 적용하는 방법에 대해 알아보자. 패치는 다음과 같이 한다.

 

# patch [옵션] [원본 파일] [패치 파일]

# patch -p1 < ../패치할 파일이 있는 디렉토리/

# patch -p0 < ./패치할 파일이 있는 디렉토리/

 

위에서 옵션 -p1은 현재 디렉토리에서 볼 때 한 단계 상위 디렉토리에 있는 파일에 패치를 적용하기 위한 것이고 -p0는 현재 디렉토리에 있는 파일에 패치를 적용하기 위한 것이다.

만약 프로그램 버전이 업그레이드 되었는데 패치 파일은 그 전 버전의 소스에서 만들어졌을 때 패치를 적용하면 어떻게 될 것인가? 운이 좋아서 바뀐 부분의 근처에 별로 바뀐 점이 없다면 그대로 적용된다. 만약 아니라면, reject한다는 에러 메시지를 만나게 될 것이다. 따라서 기능개선이나 버그를 개선하는 패치를 만든 경우 개발자에게 전달해서 다음 버전에는 적용되도록 하는 것이 좋다. 또한 패치 파일이 여러 개일 경우에는 패치를 적용하는 순서에 주의하여 패치를 해야 한다.

참고로 어떤 한 프로그램에 대한 패치가 여럿인 경우 그 파일명만을 보고 무엇을 하는 패치인지 파악할 수 있다면 좋을 것이다. 따라서 패치의 이름은 ‘프로그램 이름-버전-역할.patch' 정도로 할 것을 권한다.

  • Dreamy 2012.10.22 10:55

    복잡해서 요약.

     

    <.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

     

  • Dreamy 2015.05.19 14:18

    Git에서 patch 만들기


    git format-patch {Commit ID}


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
150 C# 정규식 사용하기 2012.11.27 18266 0
149 LINUX ls 명령어 옵션 1 file 2012.11.27 16728 0
148 개념 스트리밍 개요 Streaming overview 2012.11.26 15405 0
147 개념 AAC, MPEG Advanced Audio Coding file 2012.11.22 17767 0
146 개념 AC3, Dolby Digital file 2012.11.14 15671 0
145 개념 DTS(Digital Theater System) 2012.11.14 15924 0
144 C# 컬렉션(Collection) - ArrayList / HashTable / Queue / Stack 2012.11.12 17942 0
143 Android [GIT] git stash 사용하기 2012.10.22 33263 0
142 일반 Beyond Compare로 patch 파일 만들기, 적용하기 file 2012.10.22 17982 0
» LINUX 패치 파일 만들기와 적용하기 (patch, diff) 2 2012.10.22 37850 0
140 C# C# 문자열 숫자형식 포맷팅 String.Format ( C# Numberic Formatting ) 2012.10.10 61401 0
139 C 정규식 테스트 사이트 2012.09.20 19383 0
138 일반 DOSKEY 명령어 사용법 2012.09.19 16697 0
137 일반 CMD 창에서 ALIAS 사용하기 2012.09.19 16847 0
136 Android 자바 call stack을 임의로 보는 방법 2012.09.05 19771 0
목록
Board Pagination ‹ Prev 1 ... 20 21 22 23 24 25 26 27 28 29 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5