"Hunk # 1 FAILED at 1 (다른 라인 엔딩)"메시지를 수정하는 방법?


22

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

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


시도하십시오 sed -i.bak -e 's/\r$//g' something. dos2unix가 원하는대로 줄 끝을 혼합하여 처리한다고 생각하지 않습니다.
Arthur2e5

명백한 악; 당신이 CF-LF 라인 엔딩, 파일과 동일하여 패치가있을 경우, 먼저 행복하게 다음 라인 엔딩이 (가하는 것이 적합 던져 여러분의 패치에서 CR을 제거합니다 단지 파산) 일치하지 않습니다.
SF.

답변:


5

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

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

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

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


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옵션을 추가하십시오 .

5
--ignore-whitespace (두 번째 대시 없음)도 도움이되지 않습니다. 질문을 업데이트했습니다.
user1709408 9

0

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

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

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

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

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

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

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