Erstellen Sie einen einheitlichen Diff-Patch aus zwei Texten
Fügen Sie links das Original und rechts die Revision ein und speichern Sie dann den Patch. Im ausgearbeiteten Beispiel wird „Beta“ zu „Beta überarbeitet“ und „Delta“ wird zu „Epsilon“, sodass das Minimalzeilenskript zwei Löschungen und zwei Hinzufügungen aufweist; Mit drei Kontextzeilen werden die benachbarten Bearbeitungen zusammen in einem @@-Block angezeigt.
Einheitlicher Diff-Patch
Ein Standard-Patch --- / +++ mit @@-Bereichen, ausgewähltem Kontext und expliziten Markierungen für fehlende letzte Zeilen.
Das komplette Zeilenbearbeitungsskript
| Unchanged | 1 | 1 | alpha |
| Removed | 2 | beta | |
| Added | 2 | beta revised | |
| Unchanged | 3 | 3 | gamma |
| Removed | 4 | delta | |
| Added | 4 | epsilon |
Eine geänderte Zeile wird als Minuszeile gefolgt von einer Pluszeile codiert, da Unified Diff keine separate Ersetzungsoperation hat.
Unveränderte Alpha- und Gammalinien bieten Kontext, der einem Patch-Konsumenten hilft, die Änderungen im Zieldokument zu finden.
Die Header --- und +++ verwenden einen bereinigten lokalen Dateinamen und enthalten keinen Zeitstempel oder Maschinenpfad.
So funktioniert es
So wird es gemacht
- CRLF und einzelne CR-Zeilenenden werden auf LF normalisiert, während aufgezeichnet wird, ob die letzte logische Zeile jedes Dokuments einen abschließenden Zeilenumbruch hat.
- Erstellen Sie eine Matrix mit der längsten gemeinsamen Teilsequenz über den gesamten Zeilentext und seinen Beendigungsstatus und wählen Sie das Löschen vor dem Einfügen aus, wenn mehrere Mindestskripts übereinstimmen.
- Erweitern Sie jede geänderte Bearbeitung um die erforderliche Anzahl unveränderter Kontextzeilen und führen Sie Bereiche, die sich berühren oder überlappen, zu einheitlichen Diff-Hunks zusammen.
- Schreiben Sie bereinigte ---- und +++-Beschriftungen, den genauen @@-Start, Zählbereiche und Leerzeichen sowie Minus- oder Plus-Zeilenpräfixe in einen herunterladbaren Patch.
Wovon es ausgeht
- Der Vergleich erfolgt zeilenbasiert und nach der Zeilenumbruchnormalisierung exakt. Unterschiede zwischen Leerzeichen, Groß- und Kleinschreibung und Unicode-Normalisierung werden nicht ignoriert.
- Jede Seite ist auf 2.000 Zeichen begrenzt, wodurch die quadratische Matrix der längsten gemeinsamen Teilsequenz im Browser begrenzt bleibt.
- Es kann mindestens ein Bearbeitungsskript vorhanden sein. Bindungen, die zuerst gelöscht werden, machen diese Ausgabe wiederholbar, aber nicht eindeutig mathematisch privilegiert.
- Ein syntaktisch erstellter Patch kann immer noch gegen eine dritte Datei fehlschlagen, deren umgebender Inhalt sich geändert hat; Dieses Tool wendet keine Patches an oder führt sie zusammen.
Fragen
Warum zählt das Ersetzen von zwei Zeilen als vier Änderungen?
Das Zeilenbearbeitungsmodell entfernt jede alte Zeile und fügt jede neue Zeile ein. Zwei Ersetzungen führen also zu zwei Löschungen und zwei Hinzufügungen.
Kann der generierte Patch meinen lokalen Pfad offenlegen?
Nein. Es wird nur das endgereinigte Etikett verwendet; Durch Schrägstriche getrennte Verzeichnisse, Backslashes und Steuerzeichen werden verworfen, bevor Header geschrieben werden.
Quellen
Die vollständige Methode, das Rechenbeispiel und alle Annahmen hinter diesem Ergebnis stehen auf Text-Diff-Maker.