다음 명령을 사용하여 패치를 만들려고 합니다.
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: 아주 좋은 기사를 찾았습니다:https://stackoverflow.com/a/4425433/1709408
답변1
patch
MSYS2와 함께 제공되는 명령을 사용하여 Windows에서 동일한 문제가 발생했습니다. 내 경우에는 소스 파일과 패치 모두 CRLF 줄 끝이 있어서 둘 다 LF로 변환해도 작동하지 않았습니다. 유효한 방법은 다음과 같습니다.
$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...
patch
패치된 모든 파일의 줄 끝을 LF로 변환하므로 다시 CRLF로 변환해야 합니다.
Obs: patch
제가 사용하고 있는 버전은 2.7.5입니다.
답변2
일반적으로 다음을 사용하여 이 문제를 해결할 수 있습니다.-l
옵션:
-l 또는 --ignore-whitespace 옵션을 사용하면 패치가 공백 문자(예: 공백 및 탭)를 느슨하게 비교하여 패치 파일의 비어 있지 않은 공백 시퀀스가 입력 파일의 비어 있지 않은 공백 시퀀스와 일치하도록 합니다.
이는 표준 기능입니다(참조:POSIX 패치설명하다).
그러나 OP는 질문을 댓글로 수정했습니다.서로 다른 운영 체제 간에 git core.autocrlf를 사용하는 방법, Windows의 파일에서 문제가 발생함을 암시하는 예제를 추가했습니다(Unix 스타일 예제와 반대). patch
CRLF와 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
처리 하고 행에 후행 LF가 있는지 여부에 따라 일부 특수 처리를 수행합니다. CR에 대한 언급은 없습니다. 그것은 초점을 맞춘다spaceTabcheck_line_endings
하지만 해당 정보는 거부 진단을 돕기 위한 메시지의 일부로만 사용됩니다. 뒷면의 CR을 제거합니다.pget_line--binary
이 옵션이 제공되지 않는 한 .
GNU 패치에는 LF로 끝나는 패치를 CRLF로 끝나는 줄이 있는 파일에 적용되도록 CRLF로 변환하라는 옵션이 없습니다. 이 경우 안정적으로 사용하려면 옵션은 다음과 같습니다.
- 모든 파일을 LF로 끝나도록 변환하거나
- 모든 파일을 CRLF 엔딩을 사용하도록 변환하고 이
--binary
옵션을 추가하세요.
답변3
모든 솔루션을 시도했지만 어떤 이유로 실패했습니다. 대신 패치하려는 파일의 줄 끝을 변경하고 패치한 다음 줄 끝을 패치한 파일로 다시 변경하여 반대 작업을 수행했습니다.
dos2unix <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
unix2dos <file I was trying to patch>
상황에 따라 반대 작업을 수행해야 할 수도 있습니다.
unix2dos <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
dos2unix <file I was trying to patch>
답변4
patch
내 경우에는 이 컴퓨터에 설치된 Strawberry Perl에서 결과가 호출되었는데 , 이것이 먼저 나왔습니다 %PATH%
(그리고 Cygwin에는 패치가 전혀 설치되지 않았습니다).
아무튼, 패치를 만들 때 사용했던 것이 아닌 다른 패치 바이너리를 사용해 패치를 적용해 보았습니다.
patch
Cygwin에 설치 하고 명시적으로 호출했는데 /usr/bin/patch
작동했습니다.