patch
patch를 사용하는 모습의 스크린샷 | |
| 원저자 | 래리 월 |
|---|---|
| 개발자 | 폴 에거트, 웨인 데이비슨, 데이비드 매켄지, 안드레아스 그륀바허 |
| 발표일 | 1985년 5월 24일 |
| 운영 체제 | 유닉스 및 유닉스 계열, 플랜 9, MSX-DOS, 마이크로소프트 윈도우 |
| 플랫폼 | 교차 플랫폼 |
| 종류 | 명령어 |
patch는 패치 파일이라 불리는 별도의 파일에 담긴 지침에 따라 텍스트 파일을 업데이트하는 셸 명령어이다. 패치 파일은 입력 파일과 원하는 내용 사이의 차이점을 나열한 텍스트 파일이다. 이 명령어는 diff를 통해 생성된 패치 파일을 지원하도록 설계되었다. 사용자는 파일의 두 버전(원본과 대상)에 대해 diff를 실행하여 패치 파일을 생성하며, 이 패치 파일은 나중에 patch가 원본 파일에 패치 파일의 내용을 더해 대상 파일을 생성하는 데 사용된다. 패치라는 용어는 패치를 적용한다는 뜻의 동사로도 쓰인다.
프로그래머가 다른 프로그래머를 위해 개발한 patch는 소스 코드를 최신 버전으로 업데이트하는 데 자주 사용되었다. 이로 인해 많은 사람이 패치를 소스 코드와 연관 지어 생각하게 되었지만, 사실 패치는 모든 텍스트에 적용할 수 있다. 패치된 파일에는 불필요한 텍스트가 쌓이지 않는데, 이는 단어의 영어적 의미를 바탕으로 일부 사람들이 오해하는 부분이다. patch는 텍스트를 추가하는 것만큼이나 제거하는 데에도 능숙하다.
여기서 설명하는 패치는 바이너리 패치와 혼동해서는 안 된다. 바이너리 패치는 개념적으로는 비슷할 수 있으나, 프로그램을 구성하는 바이너리 파일을 새 릴리스로 업데이트하기 위해 배포되는 것이다.
최초의 patch 컴퓨터 프로그램은 래리 월(이후 펄 프로그래밍 언어를 만든 인물)이 작성하여 1985년 5월 mod.sources[1](이후 comp.sources.unix가 됨)에 게시하였다. patch는 XPG4에 추가되었고, 이는 나중에 POSIX가 되었다.[2] 래리 월의 코드는 OpenBSD,[3] FreeBSD,[4] schilytools[5]에서 제공하는 "patch" 프로그램의 기반으로 남아 있다. 오픈 그룹으로 합병된 개방 소프트웨어 재단이 파생 버전을 유지 관리했다고 알려져 있다. GNU 프로젝트/자유 소프트웨어 재단은 래리 월 버전에서 분기된 patch를 유지 관리한다. 저장소는 GNU diffutils의 저장소와 다르지만, 문서는 함께 관리된다.[6] 원래 유닉스용으로 작성되었지만, 이 명령어는 윈도우(GnuWin32 및 UnxUtils 경유)와 다른 많은 플랫폼으로 포팅되었다. 구현체 중 하나는 아스키의 MSX-DOS 버전 2용 MSX-DOS2 도구에 포함되어 있다.[7]
사용
[편집]패치 파일은 텍스트이므로 품질 검토 및 텍스트 편집기를 통한 수정과 같은 과정에 사용할 수 있다.
diff 명령어 외에도 Subversion, CVS, RCS, Mercurial, Git과 같은 다른 프로그램으로도 패치 파일을 생성할 수 있다.
패치는 CVS를 포함한 많은 소스 코드 관리 시스템의 핵심 구성 요소였다.
고급 diff
[편집]더 고급 diff를 사용하면 패치와 충돌하지 않는 한, 그사이에 수정된 파일에도 패치를 적용할 수 있다. 이는 각 변경 사항을 전후 문맥(변경된 부분 직전과 직후의 텍스트)으로 둘러싸는 "문맥 diff"와 "통합 diff"(unidiff라고도 함)를 사용하여 구현된다. 그러면 patch는 이 문맥을 사용하여 패치할 영역의 위치를 찾을 수 있는데, diff에 포함된 줄 번호를 시작점으로 사용하므로 파일 앞부분의 변경으로 인해 위치가 바뀌었더라도 패치를 적용할 수 있다. 이러한 특성 때문에 문맥 및 통합 diff는 많은 소프트웨어 프로젝트에 제출하기 위한 패치 형식으로 선호된다.
위의 기능들 덕분에 diff와 patch는 오픈 소스 소프트웨어의 수정 사항을 교환하는 데 매우 대중적으로 사용된다. 외부 개발자는 공개된 최신 소스 코드를 다운로드하여 수정하고, diff 형식으로 개발 팀에 보낼 수 있다. 개발 팀은 diff를 사용하여 패치를 적용하기 전에 효과적으로 검토할 수 있으며, 외부 개발자가 접근했던 것보다 더 새로운 코드 베이스에 패치를 적용할 수 있다.
예시
[편집]다음 명령어는 oldFile로부터 newFile을 생성하는 방법을 인코딩한 패치 파일인 patchFile을 생성한다. -u 옵션은 통합 diff 형식으로 출력하도록 선택한다.
$ diff -u oldFile newFile > patchFile
다음 명령어는 patchFile에 식별된 파일에 변경 사항을 적용한다.
$ patch < patchFile
하위 디렉터리에 있는 파일을 패치하려면 추가적인 -pnumber 옵션이 필요한데, 여기서 number는 소스 트리의 기본 디렉터리가 diff에 포함되어 있으면 1, 아니면 0이다.
패치는 -R 옵션을 사용하여 취소하거나 되돌릴 수 있다.
$ patch -R < patchFile
원본으로 사용된 파일이 실제 원본 파일과 크게 다르면 패치를 깔끔하게 적용할 수 없다. 예를 들어, 텍스트 줄이 맨 앞에 삽입되면 패치에서 참조하는 줄 번호가 올바르지 않게 된다. patch는 주변 줄을 살펴 패치할 텍스트의 위치를 다시 찾아 이를 복구할 수 있다. 또한 문맥 줄(문맥 및 통합 diff의 경우)이 변경된 경우에도 복구하는데, 이를 퍼즈(fuzz)라고 한다.
같이 보기
[편집]각주
[편집]- ↑ Wall, Larry (1985년 5월 8일). “patch version 1.3”. 뉴스그룹: mod.sources. 2023년 4월 4일에 원본 문서에서 보존된 문서. 2024년 7월 14일에 확인함.
- ↑ – 명령어와 유틸리티 오픈 그룹의 단일 유닉스 규격, Issue 7 참고
- ↑ http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/patch/ 보관됨 2017-06-07 - 웨이백 머신 OpenBSD patch source
- ↑ – 리눅스 사용자 명령어 매뉴얼 페이지
- ↑ “Schilytools”. 2023년 5월 8일에 원본 문서에서 보존된 문서. 2023년 5월 8일에 확인함.
- ↑ “Patch.c\SRC - patch.git - GNU patch”. 2023년 5월 8일에 원본 문서에서 보존된 문서. 2023년 5월 8일에 확인함.
- ↑ MSX-DOS2 Tools User's Manual by ASCII Corporation
외부 링크
[편집]- GNU tools for Win32 - Win32 port of tools, including diff and patch
- diffstat - show statistics from output of diff