자식 : 패치가 적용되지 않습니다


289

my_pcc_branch.patch라는 특정 패치가 있습니다.

적용하려고하면 다음과 같은 메시지가 나타납니다.

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

무슨 뜻인가요?

이 문제를 어떻게 해결할 수 있습니까?


주위에 AbstractedPanel.java.rej 파일이 있습니까? 일반적으로 이것은 라인 봇이 패치뿐만 아니라 소스에서도 변경되었음을 의미합니다 (여기서 13 행은 영향을받는 것 같습니다).
Rudi

아니요, * .rej 파일을 찾지 못했습니다.
Dmitrii Pisarenko

허용 된 답변이 왜 그것을 고칠 지 잘 모르겠습니다 (빨간 청어 인 것 같습니다). has type 100644, expected 100755어딘가에 chmod 권한이 일치 하지 않는다고 암시하지 않습니까?
ruffin

답변:


325

git apply --reject --whitespace=fix mychanges.patch 나를 위해 일했다.

설명

--reject옵션은 패치를 적용하는 방법을 결정할 수없는 경우 git에 실패하지 않도록 지시하지만, 개별 덩어리를 적용하는 대신 적용 .rej할 수없는 덩어리에 대한 거부 파일 ( )을 생성하고 생성 할 수 있습니다. Wiggle 은 "[이들] 거부 된 패치를 적용하고 단어 별 차이를 수행 할 수 있습니다".

또한 --whitespace=fix공백 오류에 대해 경고하고 적용 가능한 다른 덩어리를 적용하지 않고 수정하려고합니다.

두 옵션 모두 함께 패치 적용을 실패에 대해보다 강력하게 만들지 만 결과와 관련하여 추가주의가 필요합니다.

전체 설명서는 https://git-scm.com/docs/git-apply를 참조 하십시오 .


8
완전히 내 파일을 수정하지 않았기 때문에 이것은 실제로 나를 위해 더 나은 일
웨인 베르너

10
대단하다. 스스로 해결할 수없는 것을 거부하면 거부 된 파일을 수동으로 수정할 수 있습니다.
Dennis

1
patch -p1 <mychanges.patch #는 덩어리 단위로 변경 사항을 적용합니다. 변경이 실패하면 <sourcefile> .orig 및 <sourcefile> .rej 패치가 작성되며 변경 사항을 수동으로 적용 할 수 있습니다. git apply --reject가 똑같이하고 --whitespace = fix가 마술처럼 더 좋다고 생각합니다.
gaoithe

7
이 명령은 .rej패치 적용 방법을 자동으로 감지 할 수 없을 때 파일을 작성 합니다. 위글 을 사용 하여 이러한 문제를 해결할 수 있습니다 .
goodniceweb

14
이 답변은 특히 어떤 경우에 효과가 있는지 설명하지 않습니다. 사람들, 당신은 실제로 더 많은 답변 품질을 요구해야합니다. 이것은 포럼이 아닙니다.
Oliver

319

msysgit@googlegroups.com 메일 링리스트의 Johannes Sixt는 다음 명령 줄 인수를 사용하여 제안했습니다.

git apply --ignore-space-change --ignore-whitespace mychanges.patch

이것은 내 문제를 해결했습니다.


25
누구든지 나를 도울 수 있고 이것이 왜 효과가 있는지 설명 할 수 있습니까? 다른 대답은 저에게 효과가 없었으며 질문자가 설명하는 것과 똑같은 문제가있었습니다. 파일 속성은 공백을 무시하는 것과 어떤 관련이 있습니까?
skrebbel

1
Windows Powershell 사용 git diff로 만든 패치는 다음과 같이 성공적으로 적용되었습니다. git diff HEAD..613fee-myfile.xml | 파일이 일을하지 않았다 첫째는 같은 문제에 경우 누군가 실행에,은 diff 출력을 저장하는 반면 자식은, --ignore 공간 변화 --ignore-공백을 적용
tjb

2
또한 -C1적용을 위해 전환을 시도 하면 중요한 것으로 간주되는 추가 관련 컨텍스트가 줄어 듭니다.
Amir Ali Akbari

2
@EricWalker, CR / LF를 사용하는 git magic이 반드시 나쁜 것은 아닙니다. 대안은 변경 세트의 절반이 터치 된 모든 파일의 한 줄에서 한 줄에서 다른 줄로 변경되고 실제 변경이 중간에 묻혀있을 수 있다는 것입니다.
jwg

3
때때로 도움이됩니다. 그러나 다른 경우에도 패치가 문제없이 적용 되더라도 여전히 "패치가 적용되지 않습니다"라는 메시지가 나타납니다.
Thomas Levesque

118

모든 사람이 실패하면, 시도 git apply--3way옵션을 .

git apply --3way patchFile.patch

--3way
패치가 정상적으로 적용되지 않는 경우, 3 방향 병합에 다시 가을 패치가 적용하도록되어 모양의 신원을 기록하는 경우, 우리는 가능성이있는 파일의 충돌 마커를 떠나, 로컬에서 사용할 수있는 모양이 사용자가 해결하는 작업 트리 이 옵션은 --index 옵션을 의미하며 --reject 및 --cached 옵션과 호환되지 않습니다.

일반적인 실패 사례는 가능한 한 많은 패치를 적용하며 git에서 해결하기 위해 충돌이 발생하지만 일반적으로 그렇게합니다. 아마도 reject대안 보다 한 걸음 더 쉬울 것 입니다.


2
이것이 나를 위해 일한 대답입니다. 패치중인 파일에는 패치를 생성 한 후 변경 사항이 반영되지 않았으므로 패치를 생성 한 변경 내용이 반영되지 않았습니다.
Christia

3
좋은 일반적인 해결책. 3way diff는 일반적으로 약간 혼란스러워 보이지는 않았지만 결코 이것으로 인해 갈등을 해결하고 패치를 적용 할 수있는 능력을 얻지 못했습니다.
steinybot

8
이것이 --3way기본 동작이어야 한다고 생각합니다 . 패치가 실패하면 적어도 수동으로 해결할 수 있도록 실패한 부분을 알려주십시오. git apply그냥 실패하고 왜 실패했는지보고하지 않습니다. 심지어 생성 된 *.rej파일들 도 찾을 수 없었습니다 hg.
Pavan Manjunath

4
확실히 최고의 솔루션입니다. 사용자가 자신의 갈등을 해결하도록하십시오!
Mosh Feu

56

이 명령은 문제를 해결하지 않고 패치를 적용하여 잘못된 파일을 *.rej다음 과 같이 남겨 둡니다 .

git apply --reject --whitespace=fix mypath.patch

당신은 그들을 해결해야합니다. 해결되면 다음을 실행하십시오.

git -am resolved

7
해결 방법 *.rej-찾을 수있는 모든 것은 소스 파일에서 수동으로 변경하고 이러한 .rej파일을 삭제하는 것 입니다. 다른 방법?
coding_idiot

1
@coding_idiot 평소와 같이 .rej 파일을 확인하고 충돌하는 파일과 비교 한 다음 고정 파일을 인덱스에 추가하십시오 ( "git add FIXED_FILES"사용)
Ivan Voroshilin

2
@coding_idiot wiggle 을 사용 하여 해결할 수 있습니다. 예를 들면 다음과 같습니다 wiggle --replace path/to/file path/to/file.rej.. 이 명령은 .rej파일에서 원본 파일로 변경 사항을 적용 합니다. 또한 원본 파일의 사본을 만듭니다 (예 :) path/to/file.porig. , 체크 아웃 문서는 호기심에 대한 자세한 정보를 얻을 바랍니다
goodniceweb

22

여기에 제안 된 솔루션을 사용해보십시오 : https://www.drupal.org/node/1129120

patch -p1 < example.patch

이것은 나를 도왔다.


3
나는 당신이 이것을해서는 안된다는 것을 알고 있지만 너무 감사합니다! 시간을 절약했습니다. "패치 적용 안 됨"및 모든 종류의 오류가 발생했습니다.
sudo rm -rf 슬래시

@ sudorm-rfslash, 왜 우리는 이것을하지 않아야하며 왜 그렇게 했습니까?
블랙

git: 'patch' is not a git command. 의 위에 git version 2.21.1 (Apple Git-122.3)
Sridhar Sarnobat

16

Windows에 실제로 "x"비트 개념이 없으므로 Windows에서 rw-r--r--(0644) 파일 의 체크 아웃이 msys POSIX 계층에 의해 "승격"되어 UNIX와 Windows git 클라이언트를 혼합 할 때 발생 합니다 rwx-r-xr-x(0755). . git은 모드 차이가 기본적으로 파일의 텍스트 차이와 동일하다고 생각하므로 패치가 직접 적용되지 않습니다. 여기서 유일하게 좋은 옵션은 (사용 ) 으로 설정 core.filemode하는 것 입니다.falsegit-config

다음은 관련 정보와 관련된 msysgit 문제입니다. http://code.google.com/p/msysgit/issues/detail?id=164(2013.12.03 사본으로 다시 라우팅 됨)


2
"git config core.filemode false"명령을 실행하려고했지만 도움이되지 않았습니다. 여전히 같은 메시지가 나타납니다.
Dmitrii Pisarenko

트리에 커밋되지 않은 변경 사항이 없다고 가정하면 git reset --hard HEADgit이 새 옵션을 적용하여 파일을 다시 체크 아웃하도록하십시오.
벤 잭슨

"git reset --hard HEAD"를 실행 해 보았습니다. 성공했습니다 ( "HEAD is now at ..."메시지가 표시됨) "git apply"문제가 지속됩니다.
Dmitrii Pisarenko

7

필자의 경우 처음에는 패치 파일을 잘못 작성하여 실제로 잘못된 방식 으로 확산시킬만큼 어리 석었습니다 . 나는 똑같은 오류 메시지로 끝났습니다.

당신이 master and do 인 경우 git diff branch-name > branch-name.patch, 이것은 당신이하고 싶은 모든 추가 사항을 제거하려고 시도하고 그 반대의 경우도 마찬가지입니다.

따라서 지점에 체크 아웃하고 실행하십시오. git diff master > branch-name.patch


3

경고 :이 명령은 이전에 손실 된 커밋을 영구적으로 제거 할 수 있습니다. 이것을 시도하기 전에 전체 저장소의 사본을 작성하십시오.

이 링크를 찾았습니다

왜 이것이 효과가 있는지 모르겠지만 많은 해결 방법을 시도했지만 이것이 나를 위해 일한 유일한 방법입니다. 간단히 말해 아래의 세 가지 명령을 실행하십시오.

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

3
이것은 reflog에서 오래된 손실 커밋을 영원히 제거 할 수있는 매우 위험한 명령입니다. 리포지토리가 불안정한 상태 인 경우이 항목을 적용하지 마십시오.
동부 표준시

0

내가 찾은 것은 여기에서 정확히 지적되지 않았으므로 비슷한 것을 검색 할 수있는 다른 사람들의 이익을 위해 글을 쓰고 있습니다. 하나의 파일 (이전 저장소에 있음)이 저장소에서 제거되는 문제에 직면했습니다. 패치를 적용하면 적용 할 파일을 찾을 수 없어서 실패합니다. (내 경우에는 파일이 제거되어 git 패치가 실패합니다.) '#git apply --reject'는 확실히 뷰를 제공했지만 수정을하지 못했습니다. 빌드 서버에서 우리가 사용할 수 없으므로 흔들림을 사용할 수 없습니다. 필자의 경우 적용하려고 시도한 패치 파일에서 '리포에서 제거 된 파일'항목을 제거 하여이 문제를 겪었으므로 문제없이 다른 모든 변경 사항을 적용했습니다 (3 가지 방법으로 병합 사용, 피하기 white space errors), 그런 다음 수동으로 파일의 내용을 병합하여 이동 한 곳으로 제거했습니다.


0

내 문제는 내가 실행 git diff한 다음 실행 한 다음 실행 git reset --hard HEAD취소하고 싶다는 것을 깨달았으므로 출력을 git diff파일로 복사하고 사용하려고했지만 git apply"패치가 적용되지 않습니다"라는 오류가 발생했습니다. 로 전환 한 후에 patch그것을 사용하려고, 난은 diff의 덩어리가 어떤 이유로 반복 실현하고, 중복을 제거한 후 , patch(그리고 아마도 또한 git apply)했다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.