조회 수 25928 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
483 C 힙 정렬 Heap Sort file 2005.08.10 34231 0
482 Pi 회로부품 메모 1 secret 2019.08.09 1 0
481 JAVA 현재시간 구하기 2015.10.21 3772 0
480 MFC 현재디렉토리의 파일리스트들을 알아오는 클래스 CFindFile 2008.05.07 56569 0
479 MFC 현재 실행된 어플리케이션의 디렉토리 적용하기 2008.05.07 35534 0
478 MFC 프로젝트 Resource에서 파일로 저장하는 방법 2010.11.01 30868 0
477 LINUX 프로세스를 이름으로 단번에 종료하기 2017.06.07 3700 0
476 MFC 폴더가 존재하는 지 확인하고, 없으면 만드는 함수 2010.02.01 52310 0
475 Pi 포토커플러 Photo Coupler 특징, 종류, 출력, 구조, 동작 원리, 파라미터 2019.01.03 4373 0
» LINUX 패치 파일 만들기와 적용하기 (patch, diff) 2 2012.10.22 25928 0
473 MFC 파일 읽기 전용 해제 및 설정 2009.09.11 48397 0
472 PHP 파일 데이터 저장하고 불러오기(파일 입출력) 2015.09.30 4096 0
471 Pi 파이썬 코드를 이용한 파이카메라 제어 2018.04.24 3797 0
470 C# 트레이 아이콘 만들기 2013.08.05 10114 0
469 C# 텍스트 파일에서 읽기/쓰기 2013.08.08 10011 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 33 Next ›
/ 33

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5