Czy to dobry sposób na utworzenie łatki?


15

Chciałbym stworzyć łatkę z określonego gccoddziału porównującą ją z oficjalnymi wydaniami; więc kiedy rozpakuję archiwum ze stabilnego wydania, mogę zastosować łatkę i uzyskać równowartość tego, co było w tej konkretnej gałęzi.

Po raz pierwszy muszę utworzyć łatkę, więc robię to po raz pierwszy, a moim głównym celem jest prawidłowe wybranie opcji i parsowanie, ponieważ mówimy o niezwykle ważnym oprogramowaniu

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

Czy to wystarczy i najlepiej to zrobić?


Zwykłe dobre praktyki tutaj obejmują kontrolę wersji lub niektóre ich warianty. Obejmuje to mercurial, git i powiązane z nimi rozszerzenia kolejki łatek. Możesz również rozważyć pikowanie. Być może mógłbyś podać bardziej szczegółowe informacje na temat tego, co próbujesz zrobić?
Faheem Mitha

@ FaheemMitha, co masz na myśli przez „więcej szczegółów”? Mam wersję gccz oficjalnej stabilnej tar.bz2i inną niestabilną wersję z gitrepozytorium, chciałbym stworzyć łatkę, oczywiście chciałbym porównać tylko z mastergałęzią, a nie z całym repozytorium.
user2485710,

OK, cóż, na pewno możesz użyć czegoś tak prostego jak diff. ale generalnie preferowana jest kontrola wersji. Po pierwsze, znacznie trudniej jest zapomnieć o tym, co robisz.
Faheem Mitha

@ FaheemMitha Nie rozumiem, co sugerujesz, moje tar.bz2najwyraźniej nie jest gitrepozytorium, jak myślisz, że powinienem postępować?
user2485710,

1
Wyszukaj „tworzenie poprawek za pomocą kontroli wersji”. Dwie poprzednie odpowiedzi, które napisałem, są powiązane: unix.stackexchange.com/a/127810 i unix.stackexchange.com/a/139817
Faheem Mitha

Odpowiedzi:


20

Tak, to dobry sposób na utworzenie łatki.

W skrócie:

  1. Aby utworzyć łatkę dla pojedynczego pliku, może wyglądać twoje polecenie

    diff -Naru file_original file_updated > file.patch

    gdzie

    • -N: traktuj nieobecne pliki jako puste
    • -a: traktuj wszystkie pliki jak tekst
    • -r: rekurencyjnie porównaj wszystkie znalezione podkatalogi
    • -u: wypisuje NUM (domyślnie 3) linie ujednoliconego kontekstu
  2. Aby utworzyć łatkę dla całego katalogu:

    diff -crB dir_original dir_updated > dfile.patch

    gdzie

    • -c: wypisuje NUM (domyślnie 3) linie skopiowanego kontekstu
    • -r: rekurencyjnie porównaj dowolne podkatalogi
    • -B: ignoruj ​​zmiany, których wszystkie wiersze są puste

W końcu, aby zastosować tę łatkę, można uruchomić

patch -p1 --dry-run < dfile.patch

gdzie przełącznik pinstruuje łatkę, aby usunęła prefiks ścieżki, aby pliki zostały poprawnie zidentyfikowane. W większości przypadków tak powinno być 1.

Usuń, --dry-runjeśli jesteś zadowolony z wyniku wydrukowanego na ekranie.


pytanie: co się stanie, jeśli katalog lub plik zostanie usunięty w dir_updatedporównaniu do tego, co było w nim dir_original? diffDba o to czy robi zbyt pomijane?
user2485710,

@ user2485710 diff sprawdza, które pliki zostały usunięte. file.patchtylko w pliku tekstowym, dzięki czemu można go otworzyć w dowolnym edytorze lub po prostu cat, a zobaczysz wiersz podobnyonly in dir_original: missingfile.txt
jimmij

ok, ale czy to patchusunie, missingfile.txtczy co jeszcze?
user2485710,

To zależy. Jeśli chcesz je usunąć, użyj diff -N ...jak w moim pierwszym przykładzie. Zwykle patchdomyślnie usuwa puste pliki. Jeśli nie chcesz, po prostu użyj tylko diff -crBjak w swoim pytaniu. Również w niektórych (rzadkich) przypadkach potrzebna jest -Eopcja w patchpoleceniu, aby usunąć puste pliki, po ręcznej if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
łatce

Zabrakło mi diff -Naru dir/file dir/file.new > diff.patchsię can't find file to patch at input line 3z patch -p0 --dry-run < diff.patchpierwszej linii plaster czyta --- dir/filedrugi +++ dir/file.newze znaczników czasu, diff wydaje się być w porządku, jest jakaś opcja, jak zgłosić dokładnych nazw wygląda dowodzenia dla?
ptica

0

Jeśli chcesz porównać najnowszą wersję Git Checkin z jakąś stabilną wersją, po prostu przejdź git diff the-stable-versiondo repozytorium (musisz dowiedzieć się, jaki znacznik to opisuje, prawdopodobnie dokładny numer wersji lub jakiś wariant). gitzachowuje pełną historię projektu (normalnie istnieją sposoby na złapanie tylko części). Nie ma znaczenia, czy the-stable-versionjest w innej gałęzi programowania (tj. Rozwój rozwidlił się, a gałąź stabilna otrzymała poprawki w ostatniej chwili).

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.