본문 바로가기
3. 개발 관련/정리 :: issue 와 resovle

patch

by kyuho.choi 2009. 9. 8.
728x90
반응형
patch  는  diff 와 함께 사용되는 명령어임,
주로 diff로 두 파일 또는 두 프로젝트 디렉토리를 비교하여 차이가 있는 내용(original and later version)
을 뽑아주며 이를 patch를 이용하여 변경된 내용에 대한 적용을 손쉽게 해준다.

유용한 만큼 일부 옵션에 대하여 잘 알아두면 매우 편리한 명령어 인데,
세부적인 옵션에 대한 설명은 아직 못찾았다(예를 들자면 fuzz 레벨에 대한 의미와 같은 것들)

패치를 진행할 때 패치파일 내부의 내용들은 Hunk라고 하는 일련의 덩어리로 구분되고,
이 들은 각각 자신의 내용을 해당 파일의(patch 파일의 Index에 기반을 둔 파일) 내용을 탐색하여
변경 가능 여부를 판별한다. 

변경이 되는 경우 Hunk #N succeeded 라는 메시지를 뿌려주고,
그렇지 않은 경우 Hunk #N FAILED 라는 메시지를 뿌려준다,

또한 패치에 실패한 Hunk는 fuzz 라고하는 파일의 내용 짜맞추기가 실행되는 데,

fuzz는 해당 파일을 탐색/비교하여 패치의 내용으로 바꾸어주는 똘똘한 역할을 맞고 있는 것으로 보인다.
실행 가능 여부와 오프셋에 따라 fuzz의 레벨을 변경해가며 패치를 진행하며,
Hunk가 FAILED된 경우 해당 파일을 xxx.x.rej 형식으로 별도로 저장해준다(아직 해당 파일의 내용을 살펴보지 않아서 그렇지 않을까 하는 추측이다)

그러므로 오늘의 포스팅의 목적은 내맘에 쏙드는 패치 옵션이다.

안써두면 또 까먹게 될테니 정리해두려는데 이거 한 줄 쓸라고 신빙성 떨어지는 잡설을 늘어놓았다.

]# patch --dry-run -l -p1 <  ../patch-xxxxxxx >> patch_simualtion.txt

위 patch 명령 및 옵션의 간략한 설명은 아래와 같다.

--dry-run : 실제로 패치를 진행하는 것은 아니고 시뮬레이션을 해준다고 보면 된다. 
-l : Index 로 지정된 파일의 white space를 무시한다. 
-p1 : path를 한경로만 벗겨준다.(패치대상과 패치파일을 동일한 위치에 놓는것을 꺼림찍해서;;;;)

그러므로 패치를 가상으로 진행하여 그 결과를 patch_simulation.txt. 파일에 기록하는 내용이다.

이래야 어떤 Hunk가 Fail나고, 어떤 reject 파일들이 생겼는지를 확인하고 직접 수정해주기 위해 요즘은 저러한 방식으로 patch를 쓰고 있다.


덧으로,

patch 를 진행하는 경우 에러메시지( Hunk #N FAILED )만 보고 싶은 경우에는 -s 옵션을 사용!
728x90
반응형

댓글