diff와 patch

diff가 있다면 반대로 patch가 있다. 즉, 두 파일 혹은 디렉토리의 차이점을 출력하는 것인데, 사람이 보기에도 쉬울(?) 뿐아니라 기계가 알기에도 정교한 형식인데,
patch -p0 < foo.diff
와 같이 아무 생각없이 사용하는 patch 옵션은 -p0 외에는 거의 없다. path를 벗겨내지 말고 시도하라는 것인데, foo.diff 파일이 unified format인지 context format지 자동으로 해줄 뿐더러, foo.diff가 email 본문이라면 diff를 영역을 찾을 때까지 스킵해주는 친절함도 보여준다.

귀찮은 그러나 제일 흔히 만나는 오류

foo.diff가 만약,
diff -r old new > foo.diff
로 만들어지고, 다시 그것을 어디론가 그대로 이동하면 저렇게 사용하는 것 외에는 아무 탈 없겠지만, 터미널이나 메일에서 복사/붙이기 장난감으로 patch 신공을 시전하려면, 위 옵션만으로는 살짝 불가능한 것이 있다.

바로, 탭과 스페이스의 차이를 무시하지 못하여 사람눈에는 같은 소스에 대해 immortal로서는 절대 모른척하지 않는 것인데, patch는 똘똘함의 기본 태도는 잠시 안드로메다에 출장간 것처럼
$ patch -p0 < foo.diff 
patching file user.php
Hunk #1 FAILED at 1140.
1 out of 1 hunk FAILED -- saving rejects to file user.php.rej
헝크 무시기무시기라고만 하며 친절한 패치씨의 모습은 안보여주고, 머리에 봉침 꽂는 마사지를 뿌려댄다.

십중팔구 소스에 문제가 없을때, 저런 오류는 스페이스/탭관련 오류가 많으니
patch -l -p0 < foo.diff
요딴 마이너스엘 과자를 줘야한다. (소스 위치를 탐색 할 때 공백을 무시하라는 것이지요.)

되돌리기

어라, 패치를 했는데 달라진것이 없다. 어떻게 되돌리지?
patch -R -p0 < foo.diff
리버스임을 알수 있는 그리고 중요하니 shift를 눌러 확인하라는 "마이너스라지알".

자, 이것들 외에는 거의 쓸일이 없으니 편안히 patch에 친해지도록 하자.

신고
  1. newschool 2008.02.05 09:22 신고

    과장님 말씀대로 정말 backporting 시에 patch 를 몰랐으면 삽질많이 했을겁니다. ^^

  2. 감사감사 2010.07.31 19:02 신고

    감사감사

+ Recent posts