![여러 디렉터리의 파일에 단일 패치 적용](https://linux55.com/image/6117/%EC%97%AC%EB%9F%AC%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%8B%A8%EC%9D%BC%20%ED%8C%A8%EC%B9%98%20%EC%A0%81%EC%9A%A9.png)
디렉토리 구조는 다음과 같습니다.
orig/l1/l2/file2patch
orig/l1-2/file2patch
그리고
new/l1/l2/file2patch
new/l1-2/file2patch
이 파일들 사이에서 정확한 차이점을 찾아 하나의 파일로 저장해 보았으나 적용이 쉽지 않은 것으로 나타났습니다.
patch -d orig/ < patch.diff
나는 이것을 시도했지만 -d
패치할 파일이 즉시 존재해야 한다고 예상했습니다.orig
디렉토리에서 패치를 다시 발생시키고 패치에 있는 지정된 파일에 패치를 적용할 수 있는 방법이 있습니까?
답변1
주어진 경로 이름이 올바르지 않은 것처럼 보이지만(특히 new
다른 사람이 변경한 트리), patch
이 옵션을 사용하여 출력에서 주어진 디렉터리 수준 수를 무시하도록 프로그램에 지시할 수 있다는 것을 기억할 수 있습니다.diff
-p
패치 파일에 표시된 디렉토리와 다른 디렉토리에 있는 파일에 패치를 적용할 때 cd
해당 디렉토리로 이동하여(일치하지 않는 부분을 취소하기 위해) 이 -p
옵션을 사용하여 cd
.
다음은 문제를 해결한 방법을 보여주는 짧은 스크립트입니다(간단한 목록을 위해 GNU 패치의 테스트 실행 옵션 사용).
#!/bin/sh
cd /tmp/foo
OUT=/tmp/patch.diff
rm -f $OUT
diff -u orig/l1/l2/file2patch new/l1/l2/file2patch >>$OUT
diff -u orig/l1-2/file2patch new/l1-2/file2patch >>$OUT
diffstat -p1 $OUT
cd orig
patch -p1 --dry-run <$OUT
입력하다:
$ find . -type f
./new/l1/l2/file2patch
./new/l1-2/file2patch
./orig/l1/l2/file2patch
./orig/l1-2/file2patch
산출:
$ /tmp/xx
l1-2/file2patch | 19 +++++++++++++------
l1/l2/file2patch | 5 ++---
2 files changed, 15 insertions(+), 9 deletions(-)
/tmp/foo/orig
patching file l1/l2/file2patch
patching file l1-2/file2patch
추가 자료:
diff
-두 파일 비교(POSIX)patch
-파일에 변경 사항 적용(POSIX)diffstat
-차이 출력으로부터 히스토그램 만들기