[Linux] patch 파일 만들고 적용하기

patch 파일을 만들고 적용해보자.


환경

  • Linux 기반 시스템
  • Bash shell(/bin/bash)
  • patch, diff 그리고 git 명령어


patch, diff 그리고 git 명령어

patch 명령어

patch -pNUM < patchfile
  • patch: 패치파일을 이용해 프로젝트나 파일에 패치를 적용하는 명령어입니다.
  • 패치파일은 diffgit diff를 이용해 만들 수 있습니다.


diff 명령어

diff [OPTION]... FILES
  • diff: 두 파일 또는 프로젝트의 diff를 줄별로 비교 및 분석해주는 명령어입니다.
  • 자세한 예제는 아래 나와있습니다.


git diff 명령어

git diff
  • git diff: 현재 git이 있는 프로젝트에서 어떤 파일들이 바뀌었는지를 나타내는 명령어입니다.
  • git diff를 이용해 바로 patch 파일을 만들 수 있습니다.


diff를 이용해 patch 파일 만들기

두 파일간에 patch 파일 만들기

사용법

diff -urN [old file] [patched file]

예시

# Make diff
diff -urN test-old.txt test-new.txt

# Make patch file
diff -urN test-old.txt test-new.txt > patch.patch


프로젝트 폴더간 patch 파일 만들기

사용법

diff -urN [old directory] [patched directory]

예시

# Make diff
diff -urN neutron neutron_patched

# Make diff file
diff -urN neutron neutron_patched > neutron_patch.patch


git diff로 patch 파일 만들기

  • 바로 명령어를 사용해 파일로 남겨주시면 됩니다.
git diff > [patch file name]


patch 파일을 적용하기

사용법

patch -pNUM < patchfile
  • 패치를 할 프로젝트나 파일의 위치에서 위의 명령어를 사용해 적용합니다.
  • NUM은 패치 파일에 나와있는 경로에서 몇개를 제외할지를 나타냅니다. 예를 들어서 패치파일에 a/neutron/service.py로 나와있고 -p1을 하게 되면 앞에서 하나의 경로를 제외한 neutron/service.py에 적용이 되게 되며 만약 -p2를 하게 된다면 service.py에 적용이 되게 됩니다.


예시

  • neutron 프로젝트 안에서 패치 적용
  • neutron_patch.patch 파일이 neutron 프로젝트 폴더 바로 바깥에 미리 생성되어 있어야 합니다.
# In neutron project
cd neutron

# Apply patch file
# Option -p1 could be different depends on your patch file
patch -p1 < ../neutron_patch.patch


사용 예제

0. 과정

  • neutron 프로젝트를 clone하고 파일을 조금 변경한 후에 git diff를 이용해 patch 파일을 생성합니다.
  • neutron 프로젝트를 다시 원상태로 복구하고 patch 파일을 적용해서 파일이 바뀌는지 확인합니다.

1. neutron 프로젝트 클론 및 수정

git clone https://github.com/openstack/neutron.git
cd neutron

vi [any file in this project directory]

1. 사용할 patch 파일 생성

  • patch 파일은 자유롭게 만드셔도 됩니다.
git diff > ../neutron_patch.patch

neutron_patch.patch

diff --git a/neutron/service.py b/neutron/service.py
index 06bf4cd..67f93fe 100644
--- a/neutron/service.py
+++ b/neutron/service.py
@@ -1,4 +1,4 @@
-# Copyright 2011 VMware, Inc
+#aidfjaldfja;ifdjsaoe# Copyright 2011 VMware, Inc
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/neutron/worker.py b/neutron/worker.py
index 81e7110..a330fe0 100644
--- a/neutron/worker.py
+++ b/neutron/worker.py
@@ -9,7 +9,7 @@
 #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 #    License for the specific language governing permissions and limitations
 #    under the License.
-
+#akdfjakl;dfja;kfld
 from neutron_lib import worker
 from oslo_config import cfg
 from oslo_service import loopingcall

2. patch 파일 적용

  • neutron을 원상태로 복구하고 아래 명령어를 시행합니다.
patch -p1 < ../neutron_patch.patch


참고자료