Jak zastosować poprawkę różnicową w systemie Windows?


136

Istnieje wiele programów, które mogą stworzyć łatkę różnicującą, ale mam naprawdę dużo czasu, próbując ją zastosować. Próbuję rozpowszechniać łatkę i otrzymałem od użytkownika pytanie, jak ją zastosować. Próbowałem więc samodzielnie to rozgryźć i odkryłem, że nie mam pojęcia, a większość narzędzi, które mogę znaleźć, to wiersz poleceń. (Potrafię obsłużyć wiersz poleceń, ale wiele osób zgubiłoby się bez miłego, przyjaznego interfejsu GUI. Więc nie nadają się do tego celu).

Próbowałem użyć TortoiseSVN. Mam łatkę, którą chcę nałożyć. Klikam prawym przyciskiem myszy na poprawkę i w podmenu TortoiseSVN jest opcja, która mówi „Zastosuj poprawkę”. Wszystko, co robi, to podciąga puste okno.

Więc spróbowałem nacisnąć Open. Ma dwie opcje: scalanie i stosowanie ujednoliconych różnic. (Łatka jest na szczęście w ujednoliconym formacie różnic). Ale opcja zastosowania po prostu zwykła nie działa: prosi o łatkę i folder. Jakoś zapomniał poprosić o plik, do którego ma zostać zastosowana łatka! Więc TortoiseSVN po prostu nie działa. Czy istnieje narzędzie oparte na graficznym interfejsie użytkownika systemu Windows, które pobierze poprawkę i plik i zastosuje je poprawnie?

EDYCJA: Patrząc na dotychczasowe odpowiedzi, wydaje się, że Tortoise zrobi to dobrze tylko wtedy, gdy jest to plik, który jest już wersjonowany. Tak nie jest w tym przypadku. Muszę być w stanie zastosować poprawkę do pliku, który nie wyszedł z repozytorium SVN. Właśnie próbowałem użyć Tortoise, ponieważ tak się składa, że ​​wiem, że SVN używa różnic i muszę wiedzieć, jak je zarówno tworzyć, jak i stosować.


Odpowiedź WinMerge brzmiała dobrze, ale wyjaśnia tylko, jak zrobić łatkę, a nie jak ją zastosować. TortoiseHG ma świetny sposób na stosowanie łatek, ale tylko do plików, które są w repozytorium hg, o ile wiem. Jeśli zewnętrzny SVN TortoiseDiff nie może tego zrobić, zastanawiam się, czy może to zrobić jakieś narzędzie GUI.
Warren P

3
Wow, masz rację, krótka odpowiedź nadal brzmi: nie - przynajmniej w WinMerge. Prośba o funkcję w WinMerge tutaj sourceforge.net/tracker/ ...
KCD

Odpowiedzi:


32

Zastosuj poprawkę

Z TortoiseMerge:

  1. Znajdź i otwórz istniejący katalog repozytorium SVN
  2. Utwórz nowy katalog o nazwie „łączy”, jeśli jeszcze nie istnieje
  3. Skopiuj plik, do którego chcesz zastosować plik .patch
  4. DODAJ i ZATWIERDŹ w repozytorium svn przed przejściem do następnego kroku
  5. Kliknij prawym przyciskiem myszy scalenia i wybierz Zastosuj poprawkę ...
  6. Kliknij dwukrotnie plik z listy
  7. Poprawiony plik z różnicami jest wyświetlany w prawym panelu
  8. Kliknij ten panel i naciśnij Zapisz lub eksportuj za pomocą Plik-> Zapisz jako ...

Alternatywne screeny, jeśli otworzysz z TortoiseMerge. Na poniższym ekranie katalog odnosi się do katalogu „scalenia” wspomnianego w kroku 2 powyżej: Screeny

Zrzut ekranu graficznego interfejsu użytkownika WinMerge: Screeny


@WarrenP: tak, to wyjaśnia, jak zastosować łatkę za pomocą TortoiseMerge
Walter Stabosz

4
Mój komentarz miał sens przed edycją i nie ma już sensu po zmianach. Czy jesteś jeszcze zdezorientowany? Znacznik czasu edycji powyżej (24 marca 2011 r.) Wydaje się być nieprawidłowy, ponieważ operator operacyjny ponownie zredagował swoją odpowiedź od października 2011 r. Myślę, że sygnatura czasowa w moim komentarzu też jest błędna.
Warren P,

9
@SheriffMd Czy nie pojawia się błąd „D: \ Folder nie jest kopią roboczą”?
onmyway133

1
@SheriffMd Otrzymuję również komunikat „folder ... nie jest kopią roboczą” - więc jak można użyć funkcji scalania żółwia, aby zastosować poprawkę do niewersjonowanego pliku?
Peter T.

1
@ onmyway133, przeformułowałem kroki. Zapoznaj się z krokami 2 i 4. Nie otrzymasz komunikatu o błędzie „nie jest kopią roboczą”.
Sheriff Md

21

Stworzyłem czyste narzędzie Pythona właśnie do tego. Ma przewidywalne zachowanie na różnych platformach. Chociaż nie tworzy nowych plików (w momencie pisania tego) i nie ma GUI, może być używany jako biblioteka do tworzenia narzędzi graficznych.

AKTUALIZACJA : Powinno być wygodniej z niego korzystać, jeśli masz zainstalowany Python.

pip install patch
python -m patch

1
Często tego używam. Dzięki @techtonik. Jakieś wieści na temat współpracy z Python3?
pelson

Uruchom poprawkę instalacji pip z uprawnieniami administratora, aby upewnić się, że działa.
Vertexwahn

@Vertexwahn czy to w systemie Linux?
anatolijny techtonik

Python działa wszędzie - przetestowałem go z Windows 10
Vertexwahn

Działał w systemie Windows 10, gdy łatka git nie działała. Dziękuję Ci!
sqrl0

19

TortoiseMerge to osobne narzędzie dostarczane w pakiecie z TortoiseSVN.

Można go również pobrać osobno w archiwum TortoiseDiff.zip . Umożliwi to zastosowanie ujednoliconych różnic w plikach bez wersji.


21
AFAIK to nie może zastosować poprawki do niewersjonowanego pliku.
pihentagy

Nie miałem problemu z zastosowaniem go do niewersjonowanego pliku.
Paul Shannon,

inni trochę chcą: S.
UmNyobe

1
Wersja 1.8.7 wyświetla błąd, że dest nie jest wersjonowany.
Nick Westgate

15

Wiem, że powiedziałeś, że wolisz GUI, ale narzędzia wiersza poleceń dobrze wykonają pracę. Zobacz GnuWin, aby zapoznać się z portem narzędzi unixowych w systemie Windows. Potrzebowałbyś oczywiście polecenia patch ;-)

Możesz jednak napotkać problem z zakończeniem linii. Port GnuWin zakłada, że ​​plik poprawki ma zakończenie linii w stylu DOS (CR / LF). Spróbuj otworzyć plik łatki w rozsądnie inteligentnym edytorze, a on skonwertuje go za Ciebie.


Dobrze wyłożone. Nie byłby w stanie rozwiązać problemu z zakończeniem linii bez tego komentarza.
Bryan,

Innym sposobem radzenia sobie z zakończeniami linii jest dodanie opcji „--binary” do wiersza poleceń.
BeReal82,

4
To właśnie doprowadziło mnie do właściwej drogi. Jednak w systemie Windows 7 lub nowszym należy zaktualizować manifest pliku patch.exe, aby za każdym razem nie pojawiać się wyskakujące okienko UAC. Zobacz tę stronę, aby uzyskać instrukcje: math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu,

1
Nawet z poprawkami UAC, wersja łatki GnuWin psuje ustawienia bezpieczeństwa plików. Kompilacja dostarczona z git nie ma żadnego problemu.
Artfunkel,

8

W TortoiseSVN stosowanie poprawek działa. Musisz zastosować poprawkę w tym samym katalogu, w którym została utworzona . Należy o tym zawsze pamiętać. Oto jak to zrobić w TortoiseSVN:

Kliknij prawym przyciskiem myszy folder, do którego chcesz zastosować poprawkę. Wyświetli okno dialogowe z pytaniem o lokalizację pliku poprawki. Wybierz plik, co powinno otworzyć małe okno z listą plików, które zawiera listę zmienionych plików, a kliknięcie każdego elementu powinno otworzyć okno porównania, które pokazuje, co łatka ma zamiar zrobić z tym plikiem.

Powodzenia.


8
To nie pomaga. Pliki docelowe nie pochodzą z archiwum SVN. (Zobacz edycję oryginalnego postu.)
Mason Wheeler,

8

Narzędzie patch.exe z instalacji Git działa w systemie Windows 10.

Zainstaluj Git dla Windows, a następnie użyj "C:\Program Files\Git\usr\bin\patch.exe"polecenia, aby zastosować poprawkę.

Jeśli jakikolwiek komunikat o błędzie, taki jak a, Hunk #1 FAILED at 1 (different line endings).pojawił się na wyjściu podczas stosowania poprawki, spróbuj dodać -l(to jest skrót do --ignore-whitespace) lub --binaryprzełączniki do wiersza poleceń.


To pytanie dotyczy głównie narzędzia GUI dla zwykłych użytkowników, którzy nie są zaznajomieni z typowymi narzędziami wiersza poleceń. Twoja odpowiedź byłaby bardziej przydatna, gdybyś jako przykład podał przynajmniej kilka pełnych przykładowych poleceń.
Álvaro González

Działa z kompozytorem w systemie Windows 10.
ecdani

7

Możesz użyć tego natywnego portu Win32 narzędzia poprawki.

Jest dostarczany wraz z większym wyborem innych narzędzi iw przeciwieństwie do Cygwin i podobnych nie potrzebuje żadnych bibliotek DLL ani podobnych. Po prostu wybierz swój mały plik wykonywalny i przechowuj go w dowolnym miejscu.

Proste użycie:

patch.exe -i <patchfile>

Uzyskaj dodatkową pomoc:

patch.exe --help

4
Mam problem z tym w systemie Windows 7: otwiera nowe okno CMD i pyta o uprawnienia administratora, gdy próbuję uruchomić patch.exe.
Roy Tinker

3
Plik wykonywalny poprawki można również znaleźć w pakiecie Git dla systemu Windows.
Snicksie

6
Jeśli masz problemy z uruchomieniem programu patch.exe, możesz zmienić jego nazwę na dowolną, która nie zawiera patch. Windows uważa wszystkie exe ze słowem patchza podejrzane.
wbond

2

EDYCJA: Patrząc na dotychczasowe odpowiedzi, wydaje się, że Tortoise zrobi to dobrze tylko wtedy, gdy jest to plik, który jest już wersjonowany. Tak nie jest w tym przypadku. Muszę być w stanie zastosować poprawkę do pliku, który nie wyszedł z repozytorium SVN. Właśnie spróbowałem użyć Tortoise, ponieważ tak się składa, że ​​wiem, że SVN używa różnic i muszę wiedzieć, jak je zarówno tworzyć, jak i stosować.

Możesz zainstalować Cygwin , a następnie użyć narzędzia do łatania wiersza poleceń, aby zastosować poprawkę. Zobacz także tę stronę podręcznika systemu Unix , która dotyczy poprawki .


4
Tak, mógłbym. Właściwie to mam Cygwina. Prawdopodobnie mógłbym sprawić, że twoje rozwiązanie też zadziała. Nie zamierzam jednak przeprowadzać przez to moich użytkowników. Czy masz pojęcie, ilu użytkowników systemu Windows w dzisiejszych czasach nawet nie wie, co to jest wiersz poleceń? : P
Mason Wheeler,

2

Wygląda na to, że TortoiseSVN (TortoiseMerge) wymaga liniiIndex: foobar.py w pliku różnic / poprawek. To jest to, co musiałem zrobić, aby plik poprawki inny niż TortoiseSVN działał z poleceniem Zastosuj poprawkę, klikając prawym przyciskiem myszy TortoiseSVN .

Przed:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Po:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

Lub jeśli znasz konkretną wersję, nad którą pracował Twój współtwórca:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

2

Używam MSYS2 z http://www.msys2.org/

Zapewnia on wiele narzędzi takich jak patch, which, git, tree, i wiele innych.

Po zainstalowaniu MSYS2 wystarczy uruchomić menedżera pakietów, aby zainstalować patch:

pacman -S patch

To tylko zawiły sposób instalacji narzędzia wiersza poleceń. Podejrzewam, że czytasz tylko tytuł pytania, a nie samo pytanie. :)
Álvaro González

1

Łatka informuje, do jakiego pliku zastosować. Nagłówek powinien wyglądać mniej więcej tak (wyświetl go w Notatniku lub ulubionym edytorze tekstu):

--- Folder/old_file
+++ Folder/new_file

W przypadku poprawki do Subversion miałbyś również numery wersji (ponieważ nazwy plików są takie same).

Łata GNU pozwoli ci zastąpić te nazwy, ale nie znam żadnych narzędzi GUI, które zrobiłyby to samo. Sprawdziłbym różne programy porównujące - chociaż nie wygląda na to, że WinMerge obsługuje stosowanie łatek.


Nie, nie ma czegoś takiego na początku mojej łatki. Czy mówisz, że nazwa pliku i ścieżka muszą być zawarte w samym pliku różnicowym? Kto to wymyślił? Co powinieneś zrobić, jeśli chcesz rozesłać różnicę do kogoś, kto może mieć rzeczy zainstalowane w innych folderach?!?
Mason Wheeler

Początek łatki wygląda tak: --- / +++ / @@ -6,12 +6,12 @@ Żadnych nazw plików ani nic. Jak powinna działać wbudowana ścieżka? Co się stanie, jeśli utworzyłem łatkę na XP i ktoś próbuje jej użyć w systemie Vista (lub odwrotnie), a ścieżka do folderu Dokumenty jest inna?
Mason Wheeler

1
Nazwy plików odnoszą się do katalogu głównego repozytorium, więc różnice w strukturze folderów XP / Vista nie mają znaczenia. Powodem posiadania nazw plików w łatce jest to, że większość łat wpływa na wiele plików.
David Z,

Widzę. OK, to ma więcej sensu. Dzięki za wyjaśnienie tego, David!
Mason Wheeler

1

Eclipse powinno być w stanie to zrobić, przejdź do perspektywy TeamSynchronize, a następnie do Project-> Apply patch


1

W przypadku projektów Java używałem NetBeans do nakładania plików poprawek. Jeśli poprawiany kod Java nie jest jeszcze projektem NetBeans, utwórz dla niego projekt. Aby utworzyć nowy projekt:

  • Wybierz menu Plik -> Nowy projekt
  • W wyświetlonym oknie dialogowym ustaw go jako projekt aplikacji Java . Nadaj mu nazwę w oknie dialogowym i kliknij Finish.
  • Kliknij prawym przyciskiem myszy nazwę projektu i wybierz Właściwości z menu kontekstowego
  • W wyświetlonym oknie dialogowym wybierz Źródła i dodaj folder źródłowy . Przejdź do źródła Java.

Teraz, gdy masz już projekt, zastosuj poprawkę:

  • Podświetl swój projekt, aby go wybrać
  • Z menu głównego wybierz menu Narzędzia -> Zastosuj poprawkę różnicową
  • W wyświetlonym oknie dialogowym przejdź do pliku poprawki, zaznacz go i naciśnij przycisk Patch.

Otóż ​​to. Twoja łatka powinna zostać zastosowana i powinieneś zobaczyć okno porównania pokazujące zmiany.



1

Jeśli używasz Mercurial , odbywa się to poprzez „import”. Tak więc w wierszu hg importpoleceń polecenie lub ( --no-commitopcja może się przydać) lub „Repozytorium” => „Importuj ...” w Hg Workbench.

Zauważ, że te domyślnie zatwierdzą zmiany; możesz tego uniknąć, używając hg import --no-commitopcji, jeśli używasz wiersza poleceń lub jeśli używasz Hg Workbench, może okazać się przydatne wydanie hg rollbackpo scaleniu.


Dokładnie to, czego szukałem! Zastanawiałem się, jak uniknąć zobowiązania.
Keshav,

0

Kiedy stosuję poprawki za pomocą TortoiseSVN, zazwyczaj zapisuję ścieżkę w katalogu głównym pobranego repozytorium. Powinieneś wtedy móc kliknąć poprawkę prawym przyciskiem myszy, przejść do menu TortoiseSVN i kliknąć Zastosuj poprawkę. ApplyPatch powinien automatycznie ustalić, na jakim poziomie w hierarchii katalogów poprawka została utworzona.

W przeszłości miałem jednak problemy z nakładaniem poprawek zawierających nowe pliki lub wymagających zmiany nazw plików. Jakikolwiek algorytm użyty do tego przez Tortoise wydaje się nie radzić sobie zbyt dobrze z tymi scenariuszami. Unicode może powodować podobne problemy.


0

Czy masz dwa monitory? Miałem ten sam problem z TortoiseMerge i zdałem sobie sprawę, że kiedy wyłączyłem jeden z monitorów, pojawiło się małe okienko z listą plików. Mam nadzieję, że to ci pomoże.


0

Jeśli otrzymujesz komunikat o błędzie „Nie działa kopia”, spróbuj wybrać katalog z okna dialogowego TortoiseMerge, który jest katalogiem roboczym SVN.


0

BusyBox portu dla Windows posiada zarówno polecenie diff i patch, ale tylko obsługuje formatu zunifikowane.


0

Po prostu użyj:

patch -p0 < path-file.patch

pamiętaj, aby wykonać to polecenie tylko z folderu, w którym utworzyłeś poprawkę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.