Próbuję utworzyć łatkę za pomocą polecenia
git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
kiedy nakładam łatkę, daje mi to
$ 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
Próbowałem zastosować dos2unix zarówno do pliku src, jak i do pliku poprawki, ale komunikat nie zniknął ...
UPD: --ignore-whiteespace też nie pomaga
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: znalazłem bardzo dobry artykuł: /programming//a/4425433/1709408
sed -i.bak -e 's/\r$//g' something
. Nie sądzę, aby dos2unix radził sobie z mieszanymi końcami linii tak agresywnie, jak chcesz.Odpowiedzi:
Miałem ten sam problem przy użyciu
patch
polecenia dostarczanego z MSYS2 w systemie Windows. W moim przypadku zarówno plik źródłowy, jak i łatka miały koniec linii CRLF, a konwersja obu do LF również nie działała. To, co zadziałało, było następujące:patch
przekonwertuje zakończenia linii na LF na wszystkich poprawionych plikach, więc konieczne jest przekonwertowanie ich z powrotem na CRLF.Obs:
patch
używam wersji 2.7.5źródło
Zwykle można obejść ten problem, korzystając z
-l
opcji :Jest to standardowa funkcja (patrz opis poprawki POSIX ).
Jednak OP zmieniło pytanie, aby skomentować, w jaki sposób konwersje kończące linię działają z git core.autocrlf między różnymi systemami operacyjnymi , i dodało przykład wskazujący, że problem występuje w przypadku plików w systemie Windows (w przeciwieństwie do przykładu w stylu uniksowym). Podczas gdy
patch
stara się dopasować niedopasowania między zakończeniami linii CRLF i LF, ma tendencję do zakładania, że to drugie jest używane. Jeśli plik łatki miałby końce CRLF, a pliki do łatania nie, odzyskałby jak w tym dzienniku przykładowym:Sprawdzając kod źródłowy, w
similar
funkcji GNUpatch
traktuje białe znaki jako spacei Tab, ze specjalną obsługą w zależności od tego, czy linie mają końcowy LF. CR nie jest wspomniany. Zwraca uwagęcheck_line_endings
, ale wykorzystuje te informacje tylko jako część wiadomości, aby zdiagnozować odrzucenie. Usuwa końcowe CR w pget_line, chyba że--binary
podano opcję.Łata GNU nie ma opcji, aby przekształcić łatkę z zakończeniami LF w CRLF w celu zastosowania do plików, których zakończeniami są CRLF. Aby użyć go niezawodnie w tym przypadku, dostępne są następujące opcje
--binary
opcję.źródło
Miałem podobny problem na Cygwin. W moim przypadku poprawką było użycie
-i
flagi zamiast odczytu ze standardowego wejścia.Następujące niepowodzenie z błędem różnych zakończeń linii :
Ale udało się:
Nie jestem pewien przyczyny, ale zostawiam to tutaj na wypadek, gdyby ktoś miał ten sam problem.
źródło