program tip

이름과 경로가 다른 파일에 Git 패치를 적용하는 방법은 무엇입니까?

radiobox 2020. 9. 22. 08:02
반응형

이름과 경로가 다른 파일에 Git 패치를 적용하는 방법은 무엇입니까?


두 개의 저장소가 있습니다. 하나에서는 파일을 변경합니다 ./hello.test. 변경 사항을 커밋하고 해당 커밋에서 git format-patch -1 HEAD. 이제 hello.test와 동일한 내용을 가지고 있지만 다른 이름으로 다른 디렉토리에있는 파일을 포함하는 두 번째 저장소가 있습니다 : ./blue/red/hi.test. 앞서 언급 한 패치를 hi.test파일 에 적용하려면 어떻게해야 합니까? 나는 시도 git am --directory='blue/red' < patch_file했지만 물론 파일 이름이 동일하지 않다고 불평합니다 (Git가 신경 쓰지 않는다고 생각 했습니까?). 해당 특정 파일에 적용하기 위해 diff를 편집 할 수 있지만 명령 솔루션을 찾고 있습니다.


을 사용하여 패치를 git diff만든 다음 patch유틸리티를 사용하여 적용 할 수 있습니다. 그러면 diff를 적용 할 파일을 지정할 수 있습니다.

예를 들면 :

cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file

cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file

수동 패치 편집이나 외부 스크립트를 포함하지 않는 간단한 솔루션이 있습니다.

첫 번째 저장소에서 (이것은 또한 커밋 범위를 내보낼 수 있습니다. -1하나의 커밋 만 선택하려는 경우 사용 ) :

git format-patch --relative <committish> --stdout > ~/patch

두 번째 저장소에서 :

git am --directory blue/red/ ~/patch

--relativein 을 사용하는 대신 git format-patch다른 해결책은 -p<n>in 옵션 을 사용 하여 유사한 질문 에 대한 답변 에서 언급했듯이 패치 경로에서 디렉토리 git am를 제거 n하는 입니다.

git format-patch --relative <committish>없이도 실행할 수 있으며 파일 --stdout집합을 생성 .patch합니다. 그런 다음 이러한 파일 git amgit am --directory blue/red/ path/to/*.patch.


이 작업을 수행하는 스크립트로 내 질문에 답하기 : https://github.com/mprpic/apply-patch-to-file

패치 파일을 수동으로 수정하는 대신 사용자에게 대상 파일을 입력하라는 메시지를 표시하고 패치를 수정 한 다음 현재있는 리포지토리에 적용합니다.


@georgebrock의 답변을 바탕으로 내가 사용한 솔루션은 다음과 같습니다.

먼저 평소와 같이 패치 파일을 만듭니다 (예 :) git format-patch commitA..commitB.

그런 다음 대상 저장소가 깨끗한 지 확인하고 (변경되거나 추적되지 않은 파일이 없어야 함) 다음과 같은 패치를 적용합니다.

cd second-repo
git am ~/00*.patch

모든 패치 파일에 대해 "오류 : XYZ가 색인에 없습니다"와 같은 오류가 발생합니다. 이제이 패치 파일을 수동으로 적용 할 수 있습니다.

patch --directory blue/red < ~/0001-*.patch
git add -a
git am --continue

각 패치 파일에 대해이 세 단계를 수행해야합니다.

이것은 특별한 git format-patch명령 을 요구 하거나 패치 파일을 편집 하지 않고도 원래 커밋 메시지 등을 보존 합니다.


두 파일이 귀하의 상황에서 정확히 동일하다는 것을 알고 있으므로 패치가 성공할 가능성이 높습니다.

그러나 유사하지만 정확히 동일한 파일이 아닌 파일에 패치를 적용하거나 대화식 패치를 수행하려는 경우 3 방향 병합을 사용합니다.

당신이 파일을 수정 한 말 A,하자 나타낸다를 A~1이전 버전으로, 당신은 사이 DIFF을 적용 할 A~1A파일로 B.

Open a three way merge tool, for instance Beyond Compare, the path of left panel is A, middle panel is the common ancestor so the path is A~1, the path of right panel is B. Then, the lower panel shows the result of applying the diff between A~1 to A to File B.

The following figure illustrates the idea.

enter image description here

참고URL : https://stackoverflow.com/questions/16526321/how-to-apply-a-git-patch-to-a-file-with-a-different-name-and-path

반응형