이름과 경로가 다른 파일에 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
--relative
in 을 사용하는 대신 git format-patch
다른 해결책은 -p<n>
in 옵션 을 사용 하여 유사한 질문 에 대한 답변 에서 언급했듯이 패치 경로에서 디렉토리 git am
를 제거 n
하는 것 입니다.
git format-patch --relative <committish>
없이도 실행할 수 있으며 파일 --stdout
집합을 생성 .patch
합니다. 그런 다음 이러한 파일 git am
을 git 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~1
에 A
파일로 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.
'program tip' 카테고리의 다른 글
캐시를 지운 후 npm이 작동하지 않음 (0) | 2020.09.23 |
---|---|
Eclipse : 자바 스크립트 유효성 검사가 비활성화되었습니다. (0) | 2020.09.23 |
CSS에서 : hover 역할을하는 인라인 스타일 (0) | 2020.09.22 |
IIS7에서 eTag 헤더를 제거하려면 어떻게합니까? (0) | 2020.09.22 |
파이썬의 sorted () 함수는 안정적입니까? (0) | 2020.09.22 |