파일 F가 F'로 변경될 때 계속해서 올바르게 작동하도록 파일 F에서 작동하는 "패치" P를 생성하는 표준 옵션이 있습니까?
따라서 P'(F')가 P(F)와 동일한 변경을 생성하도록 P를 P'로 변경하는 메커니즘이 있거나 바람직하게는 F&F'에 사용할 수 있도록 탄성 P를 갖게 됩니다.
현재 저는 정규식 검색 및 교체를 사용하여 이러한 패치를 만들고 있지만 이와 같은 작업을 수행하는 표준 방법이 있는지 알고 싶습니다.
답변1
sed
나는 이런 것을 사용하는 것을 정말로 권장하지 않습니다 . 문제는 패치가 적용되더라도 "흐릿하게" 나타나는 경우가 많다는 것입니다. 즉, 일부 컨텍스트 줄이 완벽하게 일치하지 않음을 의미합니다. 이는 일반적으로 기본 주변 코드가 약간 변경되었음을 의미하지만 패치가 잘못된 위치에 적용되었음을 의미할 수도 있습니다(이런 일이 발생하는 것을 본 적이 있는데 좋지도 않고 디버그하기도 쉽지 않습니다).
또한 패치가 깔끔하게 적용되더라도 의미상 더 이상 의미가 없을 수 있습니다. 하지만 이를 포착하려면 패치된 코드에서 발생한 변경 사항을 이해해야 합니다.
명시된 이유로 인해 적어도 흐림에 적용되는 모든 항목을 검토하는 것이 좋습니다(그리고 표면적으로 오프셋에 적용되는 모든 항목도 확인). 기본 3줄 이상의 컨텍스트를 갖는 것도 좋은 생각일 수 있습니다.
큰 경고를 염두에 두고 이를 비교적 쉽게 수행하는 한 가지 방법은 버전 제어 시스템, 아마도 다음과 같은 고급 분산 시스템을 사용하는 것입니다.mercurial
또는git
. 둘 사이의 선택에 따라 의견이 다양합니다. Mercurial은 Git보다 이전 CVS 및 SVN과 더 유사하며 아마도 더 나은 학습 곡선도 가지고 있습니다(Whikle Git은 기능이 더 풍부하다고 합니다).
Mercurial에는 다음이 있습니다.Mercurial Queue(MQ) 확장이러한 상황을 위한 것입니다. 스티브 로체의 작품이에요블로그 게시물MQ 사용에 대한 매우 좋은 소개입니다. 또 다른 좋은 내용은 다음과 같습니다.MQ 가이드Mozilla 개발자 사이트.
때때로,patchutils
그것은 또한 유용할 수 있습니다.
답변2
이 문제를 병합이라고 합니다. 원본 파일 A와 두 개의 수정된 버전 B, C가 있고 이 두 가지 수정 사항을 결합한 버전 D를 만들고 싶습니다. 이는 변경 사항이 독립적인 경우에만 작동합니다. 그렇지 않은 경우 병합은 수동 프로세스입니다. 소스 코드에 대한 동시 변경 사항 병합을 처리하는 것은 소프트웨어 엔지니어링의 일반적인 작업입니다.
diff
간단한 경우에는 소스 파일이 변경된 경우 결과 패치가 이미 작동합니다. 이 patch
유틸리티는 약간의 "흐림"을 허용합니다. A에서 B를 비교하고 그 차이의 영향을 받는 영역이 A와 C에서 동일하면(그러나 파일의 오프셋이 다를 수 있음) 패치가 깨끗해집니다. 이 접근 방식 B와 C의 변경된 영역이 동일한 위치에 있지 않은 한(몇 줄로 구분해야 함) C에 적용하면 잘 작동합니다.
패치가 철저하게 적용되지 않으면 병합이 어렵고 도메인별 문제가 됩니다. 예를 들어 다음 두 가지 변경 사항을 고려해보세요.
A B C
a=2 a=3 b=2
x=a x=a x=b
2
인간은 B가 로 변경되고 3
C가 로 이름이 변경된 a
패턴을 찾는 경향이 있으므로 b
병합 결과는 b=3
, 이어야 합니다 x=b
. 그러나 자동화된 도구는 두 가지 다른 방식으로 수정되었기 때문에 첫 번째 줄을 충돌로 표시할 수 있습니다.
B와 C 모두에 "합리적인 작업"을 수행하는 패치를 작성하는 것은 어려운(AI 완성) 문제입니다. 실제 생활에서 많은 일반적인 경우 diff -u A B
as-patch를 사용하면 C에서 원하는 D가 작동하고 생성되거나 패치 응용 프로그램이 깨끗하지 않다는 오류와 함께 실패하는 경향이 있습니다.