Ist dies eine gute Möglichkeit, einen Patch zu erstellen?

15

Ich möchte einen Patch aus einem bestimmten gccZweig erstellen , der ihn mit den offiziellen Releases vergleicht. Wenn ich also den Tarball aus der Stable-Version entpacke, kann ich den Patch anwenden und das Äquivalent dessen erhalten, was sich in diesem speziellen Zweig befand.

Es ist das erste Mal, dass ich einen Patch erstellen muss. Daher mache ich das zum ersten Mal. Mein Hauptanliegen ist es, die richtigen Optionen und das richtige Parsing zu finden, da es sich um eine äußerst wichtige Software handelt

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

Ist das genug und der beste Weg, es zu tun?

user2485710
quelle
Zu den üblichen bewährten Methoden gehört die Versionskontrolle oder eine Variante davon. Dies umfasst mercurial, git und die zugehörigen Patch-Warteschlangenerweiterungen. Sie könnten auch Quilt in Betracht ziehen. Vielleicht könnten Sie etwas näher auf das eingehen, was Sie versuchen zu tun?
Faheem Mitha
@FaheemMitha was meinst du mit "mehr details"? Ich habe eine Version von gccaus dem offiziellen Stable tar.bz2und eine andere instabile Version davon aus einem gitRepository, ich möchte einen Patch erstellen, natürlich möchte ich nur mit dem masterBranch vergleichen, nicht mit dem gesamten Repository.
user2485710
OK, na ja, sicher können Sie etwas so Einfaches wie diff verwenden. Die Verwendung der Versionskontrolle ist jedoch im Allgemeinen vorzuziehen. Zum einen ist es viel schwieriger, den Überblick zu verlieren, was Sie tun.
Faheem Mitha
@FaheemMitha Ich verstehe nicht, was Sie vorschlagen, meine tar.bz2ist eindeutig kein gitAufbewahrungsort. Wie sollte ich Ihrer Meinung nach vorgehen?
user2485710
1
Führen Sie eine Suche nach "Erstellen von Patches mithilfe der Versionskontrolle" durch. Zwei frühere Antworten, die ich geschrieben habe und die zusammenhängen, sind unix.stackexchange.com/a/127810 und unix.stackexchange.com/a/139817
Faheem Mitha,

Antworten:

20

Ja, dies ist eine gute Möglichkeit, einen Patch zu erstellen.

Zusamenfassend:

  1. Zum Erstellen eines Patches für eine einzelne Datei sieht Ihr Befehl möglicherweise so aus

    diff -Naru file_original file_updated > file.patch

    wo

    • -N: Abwesende Dateien als leer behandeln
    • -a: Alle Dateien als Text behandeln
    • -r: vergleicht rekursiv alle gefundenen Unterverzeichnisse
    • -u: NUM (Standard 3) Zeilen mit einheitlichem Kontext ausgeben
  2. So erstellen Sie einen Patch für das gesamte Verzeichnis:

    diff -crB dir_original dir_updated > dfile.patch

    wo

    • -c: NUM (Standard 3) Zeilen des kopierten Kontexts ausgeben
    • -r: vergleicht rekursiv alle Unterverzeichnisse
    • -B: Änderungen ignorieren, deren Zeilen alle leer sind

Immerhin kann man diesen Patch anwenden

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

Dabei pweist switch patch an, das Pfadpräfix zu entfernen, damit die Dateien korrekt identifiziert werden. In den meisten Fällen sollte es sein 1.

Entfernen --dry-runSie, wenn Sie mit dem Ergebnis auf dem Bildschirm zufrieden sind.

jimmij
quelle
frage: was soll passieren, wenn ein verzeichnis oder eine datei im dir_updatedvergleich zu dem was dort war gelöscht wird dir_original? Die diffkümmert sich um das zu oder es wird übersprungen?
user2485710
@ user2485710 diff erkennt, welche Dateien gelöscht wurden. file.patchSie können es also in einem beliebigen Editor oder in einer Textdatei öffnen catund sehen eine Zeile wieonly in dir_original: missingfile.txt
jimmij
ok, aber dann patchwird das gelöscht missingfile.txtoder was noch?
user2485710
Es hängt davon ab, ob. Wenn Sie sie entfernen möchten, verwenden Sie diff -N ...wie in meinem ersten Beispiel. Normalerweise patchwerden leere Dateien standardmäßig entfernt. Wenn Sie nicht möchten, verwenden Sie einfach nur diff -crBwie in Ihrer Frage. In einigen (seltenen) Fällen ist die -EOption im patchBefehl erforderlich, um leere Dateien nach dem manuellen Patch zu entfernen: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
jimmij
Ich habe diff -Naru dir/file dir/file.new > diff.patchimmer can't find file to patch at input line 3mit der patch -p0 --dry-run < diff.patchersten Zeile des Patches liest --- dir/filezweiten +++ dir/file.newmit Zeitstempeln, der Unterschied scheint genau richtig zu sein, gibt es eine Option, wie die genauen Dateinamen zu melden, die der Befehl sucht?
14.