태그 보관물: patch

patch

“Hunk # 1 FAILED at 1 (다른 라인 엔딩)”메시지를 수정하는 방법? diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch 패치를

명령으로 패치를 만들려고합니다.

git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch

패치를 적용하면

$ patch -v
GNU patch 2.7.5

$ /usr/bin/patch -p1 </var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
patching file sourcefile
Hunk #1 FAILED at 1 (different line endings).
Hunk #2 FAILED at 23 (different line endings).
Hunk #3 FAILED at 47 (different line endings).
Hunk #4 FAILED at 65 (different line endings).
Hunk #5 FAILED at 361 (different line endings).
5 out of 5 hunks FAILED -- saving rejects to file sourcefile.rej

src 파일과 패치 파일 모두에 dos2unix를 적용하려고했지만 메시지가 사라지지 않았습니다 …

UPD : –ignore-whitespace도 도움이되지 않습니다

PATCH COMMAND:  patch -p1 -g0 -E --no-backup-if-mismatch --ignore-whitespace --dry-run -f < '/var/lib/layman/dotnet/dev-dotnet/slntools/files/remove-wix-project-from-sln-file-v2.patch'

=====================================================
checking file Main/SLNTools.sln
Hunk #1 FAILED at 14 (different line endings).
Hunk #2 FAILED at 49 (different line endings).
Hunk #3 FAILED at 69 (different line endings).
Hunk #4 FAILED at 102 (different line endings).
4 out of 4 hunks FAILED

UPD : 매우 좋은 기사를 찾았습니다 : /programming//a/4425433/1709408



답변

patchWindows에서 MSYS2와 함께 제공 되는 명령을 사용하여 동일한 문제가 발생했습니다 . 필자의 경우 소스 파일과 패치 모두 CRLF 줄 끝이 있었고 둘 다 LF로 변환해도 작동하지 않았습니다. 효과가 있었던 것은 다음과 같습니다.

$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...

patch 패치 된 모든 파일에서 줄 끝을 LF로 변환하므로 다시 CRLF로 변환해야합니다.

Obs : 사용중인 patch버전은 2.7.5입니다.


답변

일반적으로 다음 -l옵션을 사용하여이 문제를 해결할 수 있습니다 .

-l 또는 –ignore-whitespace 옵션을 사용하여 패치 파일이 공백 문자 (예 : 공백 및 탭)를 느슨하게 비교하여 패치 파일의 비어 있지 않은 일련의 공백이 입력 파일의 비어 있지 않은 일련의 공백과 일치하도록합니다.

이것은 표준 기능입니다 ( POSIX 패치 설명 참조 ).

그러나 OP 는 다른 운영 체제 사이에서 줄 끝 변환이 git core.autocrlf와 함께 작동하는 방식 에 대한 의견을 수정하기 위해 질문을 수정했으며 Windows의 파일에서 문제가 유닉스 스타일 예제와 달리 있음을 암시하는 예제를 추가했습니다. patchCRLF와 LF 줄 끝 사이의 불일치를 수용하려고 시도 하지만 후자가 사용된다고 가정하는 편견이 있습니다. 패치 파일에 CRLF 엔딩이 있고 패치 할 파일이없는 경우 다음 예제 로그와 같이 복구됩니다.

(Stripping trailing CRs from patch.)
patching file xterm.log.html
(Stripping trailing CRs from patch.)
patching file xterm.man
(Stripping trailing CRs from patch.)
patching file xtermcfg.hin

similar함수 에서 소스 코드를 검사하여 GNU patch는 공백을 spaceand로 Tab취급하며 행에 후행 LF가 있는지 여부에 따라 특별한 처리를합니다. CR은 언급되지 않았습니다. 에주의를 기울이지 check_line_endings만 거부 정보를 진단하기 위해 해당 정보를 메시지의 일부로 만 사용합니다. 옵션이 제공 되지 않으면 pget_line 에서 후행 CR을 제거합니다 --binary.

GNU 패치에는 LF로 끝나는 패치를 CRLF로 변환하여 줄 끝이 CRLF 인 파일에 적용 할 수있는 옵션이 없습니다. 이 경우 안정적으로 사용하려면 다음을 선택하십시오.

  • LF 엔딩을 사용하도록 모든 파일을 변환하거나
  • CRLF 엔딩을 사용하도록 모든 파일을 변환하고 --binary옵션을 추가하십시오 .

답변

Cygwin에서도 비슷한 문제가있었습니다. 필자의 경우 수정은 -istdin에서 읽는 대신 플래그 를 사용하는 것이 었습니다 .

다음은 다른 줄 끝 오류로 실패했습니다 .

patch -t -N -r - -p0 < patchfile

그러나 다음은 성공했습니다.

patch -t -N -r - -p0 -i patchfile

나는 원인이 확실하지 않지만 누군가 같은 문제가있는 경우 여기에 남겨 둡니다.


답변