Mam pewną łatkę o nazwie my_pcc_branch.patch.
Kiedy próbuję go zastosować, pojawia się następujący komunikat:
$ 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
Co to znaczy?
Jak mogę rozwiązać ten problem?
has type 100644, expected 100755
oznacza to, że gdzieś istnieje niedopasowanie uprawnień chmod?Odpowiedzi:
git apply --reject --whitespace=fix mychanges.patch
pracował dla mnie.Wyjaśnienie
Ta
--reject
opcja sprawi, że git nie zawiedzie, jeśli nie będzie w stanie określić, jak zastosować łatkę, ale zamiast zastosować indywidualne porcje, może zastosować i utworzyć pliki odrzucania (.rej
) dla porcji, których nie może zastosować. Wiggle może „zastosować [te] odrzucone łatki i wykonać słowne różnice”.Dodatkowo
--whitespace=fix
będzie ostrzegał o błędach białych znaków i spróbuje je naprawić, zamiast odmawiać zastosowania skądinąd właściwego przystojniaka.Obie opcje razem sprawiają, że aplikacja łatki jest bardziej odporna na awarie, ale wymagają dodatkowej uwagi w odniesieniu do wyniku.
Całą dokumentację można znaleźć na stronie https://git-scm.com/docs/git-apply .
źródło
.rej
pliki, gdy nie można automatycznie wykryć sposobu zastosowania poprawki. Możesz użyć wiggle do rozwiązania takich problemów.Johannes Sixt z listy mailingowej [email protected] zasugerował użycie następujących argumentów wiersza poleceń:
To rozwiązało mój problem.
źródło
-C1
zmienić na zastosowanie, zmniejsza kontekst wokół dodatków, które są uważane za ważne.Kiedy wszystko inne zawiedzie, spróbuj
git apply
„s--3way
opcję .git apply --3way patchFile.patch
Typowy przypadek awarii dotyczy jak największej liczby łatek i pozostawia cię z konfliktami do rozwiązania w git, jak zwykle to robisz. Prawdopodobnie o jeden krok łatwiej niż
reject
alternatywa.źródło
--3way
powinno to być zachowanie domyślne. Gdy łatanie się nie powiedzie, przynajmniej powiedz mi, co się nie udało, abym mógł to naprawić ręcznie.git apply
po prostu zawodzi i nie informuje, dlaczego coś się nie udaje. Nie mogłem nawet znaleźć*.rej
plików takich jak tehg
generowane.To polecenie zastosuje łatkę nie rozwiązującą jej, pozostawiając złe pliki jako
*.rej
:Musisz je tylko rozwiązać. Po rozwiązaniu uruchom:
źródło
*.rej
- wszystko, co mogę znaleźć, to ręcznie wprowadzić zmiany w pliku źródłowym i usunąć te.rej
pliki. W jakikolwiek inny sposób?wiggle --replace path/to/file path/to/file.rej
. To polecenie zastosuje zmiany z.rej
pliku do oryginalnego pliku. Tworzy również kopię oryginalnego pliku, na przykładpath/to/file.porig
. ProszęSpróbuj użyć rozwiązania zaproponowanego tutaj: https://www.drupal.org/node/1129120
patch -p1 < example.patch
To mi pomogło.
źródło
git: 'patch' is not a git command.
ongit version 2.21.1 (Apple Git-122.3)
Zdarza się to, gdy miksujesz klientów git w systemie UNIX i Windows, ponieważ system Windows tak naprawdę nie ma pojęcia „x”, więc
rw-r--r--
pobranie pliku (0644) w systemie Windows jest „promowane” przez warstwę msys POSIX jakorwx-r-xr-x
(0755) . git uważa, że różnica trybów jest zasadniczo taka sama jak różnica tekstowa w pliku, więc łatka nie ma bezpośredniego zastosowania. Myślę, że jedynym dobrym rozwiązaniem jest, aby ustawićcore.filemode
sięfalse
(za pomocągit-config
).Oto problem msysgit z niektórymi powiązanymi informacjami: http://code.google.com/p/msysgit/issues/detail?id=164 (przekierowany do kopii archive.org z 3 grudnia 2013 r.)
źródło
git reset --hard HEAD
zmusić git do ponownego pobrania plików z nową opcją.W moim przypadku byłem na tyle głupi, że w pierwszej kolejności niepoprawnie utworzyłem plik łatki, właściwie źle robiąc . Skończyłem z tymi samymi komunikatami o błędach.
Jeśli jesteś mistrzem i zrób to
git diff branch-name > branch-name.patch
, to próbuje usunąć wszystkie dodatki, które chcesz się zdarzyć i na odwrót (co było niemożliwe do osiągnięcia przez git, ponieważ, oczywiście, nigdy nie zrobiono żadnych dodatków, których nie można usunąć).Upewnij się więc, że zameldujesz się w swoim oddziale i wykonasz
git diff master > branch-name.patch
źródło
OSTRZEŻENIE: To polecenie może trwale usunąć stare utracone zatwierdzenia. Zrób kopię całego repozytorium przed próbą wykonania tego.
Znalazłem ten link
Nie mam pojęcia, dlaczego to działa, ale próbowałem wielu obejść i to jest jedyna, która działała dla mnie. Krótko mówiąc, uruchom trzy poniższe polecenia:
źródło
To, czego szukałem, nie zostało dokładnie wskazane tutaj w SO, piszę z korzyścią dla innych, którzy mogą szukać podobnych. Wystąpił problem z usunięciem jednego pliku (obecnego w starym repozytorium). A kiedy zastosuję łatkę, nie powiedzie się, ponieważ nie można znaleźć pliku do zastosowania. (więc mój przypadek jest taki, że łatka git kończy się niepowodzeniem, ponieważ plik został usunięty) „#git Apply --reject” zdecydowanie dał widok, ale nie całkiem mnie naprawił. Nie mogłem użyć wiggle, ponieważ nie jest on dostępny na naszych serwerach kompilacji. W moim przypadku przeszedłem przez ten problem, usuwając wpis „pliku, który został usunięty z repozytorium” z pliku łatki, który próbowałem zastosować, więc wszystkie inne zmiany zostały zastosowane bez problemu (używając scalania 3-kierunkowego, unikając błędy białych znaków), a następnie ręcznie scalając zawartość pliku usuniętą do miejsca, w którym został przeniesiony.
źródło
Mój problem polega na tym, że uruchomiłem
git diff
, potem uruchomiłemgit reset --hard HEAD
, a potem zdałem sobie sprawę, że chcę cofnąć, więc próbowałem skopiować dane wyjściowegit diff
do pliku i używaćgit apply
, ale dostałem błąd, że „łata nie ma zastosowania”. Po przełączeniu siępatch
i stara się go używać, zdałem sobie sprawę, że klocek diff powtórzono z jakiegoś powodu, a po usunięciu duplikatów ,patch
(i prawdopodobnie równieżgit apply
) pracował.źródło