Diff

In der Computerwissenschaft, ist ein Dateivergleich-Dienstprogramm dass Produktionen die Unterschiede zwischen zwei Dateien. Es wird normalerweise verwendet, um die Änderungen zwischen einer Version einer Datei und einer ehemaligen Version derselben Datei zu zeigen. Diff zeigt die Änderungen, die pro Linie für Textdateien vorgenommen sind. Moderne Durchführungen unterstützen auch binäre Dateien. Die Produktion wird einen "diff" oder einen Fleck genannt, da die Produktion mit dem Programm von Unix angewandt werden kann. Die Produktion von ähnlichen Dateivergleich-Dienstprogrammen wird auch einen "diff" genannt; wie der Gebrauch des Wortes "grep", für die Tat der Suche zu beschreiben, wird das Wort diff im Jargon als ein Verb verwendet, um jeden Unterschied zu berechnen.

Geschichte

Das diff Dienstprogramm wurde am Anfang der 1970er Jahre auf Unix Betriebssystem entwickelt, das aus AT&T Glockenlaboratorien in Murray Hill, New Jersey erschien. Die Endversion, die zuerst mit der 5. Ausgabe von Unix 1974 verladen ist, wurde von Douglas McIlroy völlig geschrieben. Diese Forschung wurde in einer 1976-Zeitung co-written mit James W. Hunt veröffentlicht, der einen anfänglichen Prototyp von diff entwickelt hat. Der Algorithmus dieses beschriebene Papier ist bekannt als der Algorithmus der Jagd-McIlroy geworden.

Der Arbeit von McIlroy wurde vorangegangen und unter Einfluss des Vergleich-Programms von Steve Johnson auf GECOS und des Programms von Mike Lesk. auch hervorgebracht auf Unix und, wie diff, erzeugt ändert sich Linie-für-Linie und sogar verwendete Winkelklammern (">" und "<"), um Linieneinfügungen und Auswischen in der Produktion des Programms zu präsentieren. Die in diesen frühen Anwendungen verwendete Heuristik wurde jedoch unzuverlässig gehalten. Die potenzielle Nützlichkeit eines diff Werkzeugs hat McIlroy in die Forschung und das Entwerfen eines robusteren Werkzeugs provoziert, das in einer Vielfalt von Aufgaben verwendet werden, aber in der Verarbeitung und den Größe-Beschränkungen der Hardware des PDP-11 eine gute Leistung bringen konnte. Seine Annäherung an das Problem hat sich aus Kollaboration auch mit Personen an Glockenlaboratorien einschließlich Alfred Ahos, Elliot Pinsons, Jeffrey Ullmans und Harold S. Stones ergeben.

Im Zusammenhang von Unix hat der Gebrauch des Linienredakteurs diff mit der natürlichen Fähigkeit versorgt, maschinenverwendbar zu schaffen, "editieren Schriften". Diese editieren Schriften, wenn gespart, zu einer Datei zusammen mit der ursprünglichen Datei, kann durch in die modifizierte Datei vollständig wieder eingesetzt werden. Das hat außerordentlich die sekundäre Lagerung reduziert, die notwendig ist, um vielfache Versionen einer Datei aufrechtzuerhalten. McIlroy hat gedacht, einen Postverarbeiter für diff zu schreiben, wo eine Vielfalt von Produktionsformaten entworfen und durchgeführt werden konnte, aber er hat es sparsamer und einfacher gefunden, diff zu haben, dafür verantwortlich sein, die Syntax und den durch den Befehl akzeptierten Rückordnungseingang zu erzeugen.

1985 hat Larry Wall ein getrenntes Dienstprogramm, Fleck zusammengesetzt, der verallgemeinert hat und die Fähigkeit erweitert hat, Dateien mit der diff Produktion zu modifizieren. Weisen in Emacs berücksichtigen auch das Umwandeln des Formats von Flecken und sogar dem Redigieren von Flecken interaktiv.

In den frühen Jahren von diff hat allgemeiner Gebrauch das Vergleichen von Änderungen in der Quelle des Softwarecodes und der Preiserhöhung für technische Dokumente, das Überprüfen des Programms eingeschlossen, bei Produktion die Fehler beseitigend, filesystem Auflistungen vergleichend und Computerzusammenbau-Code analysierend. Die Produktion, die dafür ins Visier genommen ist, wurde motiviert, um Kompression für eine Folge von zu einer Datei gemachten Modifizierungen zur Verfügung zu stellen. Source Code Control System (SCCS) und seine Fähigkeit, Revisionen erschienen gegen Ende der 1970er Jahre demzufolge der Speicherung zu archivieren, editieren Schriften von diff.

Algorithmus

Die Operation von diff basiert auf dem Beheben des längsten allgemeinen Subfolge-Problems.

In diesem Problem haben Sie zwei Folgen von Sachen:

ein b c d f g h j q z

ein b c d e f g i j k r x y z

und Sie wollen eine längste Folge von Sachen finden, die in beiden ursprünglichen Folgen in derselben Ordnung da ist. D. h. Sie wollen eine neue Folge finden, die bei der ersten Folge durch das Löschen einiger Sachen, und von der zweiten Folge durch das Löschen anderer Sachen erhalten werden kann. Sie wollen auch, dass diese Folge so lange wie möglich ist. In diesem Fall ist es

ein b c d f g j z

Von einer längsten allgemeinen Subfolge ist es nur ein kleine Schritt, diff ähnliche Produktion zu bekommen: Wenn ein Artikel in der Subfolge fehlt, aber Gegenwart im Original, es muss gelöscht worden sein. (Der '-' Zeichen, unten.), Wenn es in der Subfolge fehlt, aber Gegenwart in der zweiten Folge, es muss darin hinzugefügt worden sein. ('+' Zeichen.)

e h i q k r x y

+ - + - + + + +

Gebrauch

Es wird von der Befehl-Linie mit den Namen von zwei Dateien angerufen:. Die Produktion des Befehls vertritt die Änderungen, die erforderlich sind, die ursprüngliche Datei die neue Datei werden zu lassen.

Wenn ursprünglich und neu Verzeichnisse sind, dann wird diff auf jeder Datei geführt, die in beiden Verzeichnissen besteht. Eine Auswahl wird irgendwelche zusammenpassenden Unterverzeichnisse rekursiv hinuntersteigen, um Dateien zwischen Verzeichnissen zu vergleichen.

Einige der Beispiele im Artikel verwendet die folgenden zwei Dateien, ursprünglich und neu:

ursprünglich:

1 Dieser Teil des

2 Dokument ist der geblieben

3 dasselbe von der Version bis

4 Version. Es hat nicht gesollt

5 gezeigt werden, wenn es nicht tut

6 Änderung. Sonst, das

7 würde zu nicht helfen

8 pressen die Größe des zusammen

9 Änderungen.

10

11 Dieser Paragraf enthält

12 Text, der überholt ist.

13 wird Es im gelöscht

14 nahe Zukunft.

15

16 ist Es wichtig, zu buchstabieren

17 Kontrolle dieser dokument. Auf

18 die andere Hand, ein

19 hat Wort falsch buchstabiert ist nicht

20 das Ende der Welt.

21 Nichts im Rest von

22 dieser Paragraf braucht zu

23 geändert werden. Dinge können

24, danach hinzugefügt werden.

neu:

1 ist Das ein wichtiger

2 Benachrichtigung! Es sollte

3, deshalb an gelegen werden

4 der Anfang dieses

5 Dokument!

6

7 Dieser Teil des

8 Dokument ist der geblieben

9 dasselbe von der Version bis

10 Version. Es hat nicht gesollt

11 gezeigt werden, wenn es nicht tut

12 Änderung. Sonst, das

13 würde zu nicht helfen

14 pressen irgendetwas zusammen.

15 16 ist Es wichtig, zu buchstabieren

17 Kontrolle dieses Dokument. Auf

18 die andere Hand, ein 19 hat Wort falsch buchstabiert ist nicht 20 das Ende der Welt. 21 Nichts im Rest von 22 dieser Paragraf braucht zu 23 geändert werden. Dinge können 24, danach hinzugefügt werden.

25

26 Dieser Paragraf enthält

27 wichtige neue Hinzufügungen

28 zu diesem Dokument.

Der Befehl erzeugt die folgende normale diff Produktion:

0a1,6

> Das ist ein wichtiger

> bemerken Sie! Es sollte

> werden Sie deshalb an gelegen

> der Anfang dieses

> Dokument!

>

8,14c14

17c17

24a25,28

>

> Dieser Paragraf enthält

> wichtige neue Hinzufügungen

> zu diesem Dokument.

</Quelle>

In diesem traditionellen Produktionsformat, tritt hinzugefügt für den gelöschten und für den geänderten ein. Linienzahlen der ursprünglichen Datei erscheinen vorher//und erscheinen diejenigen der modifizierten Datei danach. Winkelklammern (am Anfang Linien, die, gelöschte hinzugefügt werden oder sich geändert haben), zeigen an, die die Linien ablegen, erscheinen darin. Hinzufügungslinien werden zur ursprünglichen Datei hinzugefügt, um in der neuen Datei zu erscheinen. Auswischen-Linien werden von der ursprünglichen Datei gelöscht, um in der neuen Datei vermisst zu werden.

Standardmäßig werden für beide Dateien übliche Linien nicht gezeigt. Linien, die sich bewegt haben, werden wie hinzugefügt, an ihrer neuen Position und wie gelöscht, von ihrer alten Position gezeigt. Jedoch heben einige diff Werkzeuge bewegte Linien hervor.

Schwankungen

Änderungen seit 1975 schließen Verbesserungen zum Kernalgorithmus, der Hinzufügung nützlicher Eigenschaften zum Befehl und dem Design von neuen Produktionsformaten ein. Der grundlegende Algorithmus wird in den Zeitungen Ein O (ND) Unterschied-Algorithmus und seine Schwankungen von Eugene W. Myers beschrieben

und in einem Dateivergleich-Programm von Webb Miller und Myers.

Der Algorithmus wurde unabhängig entdeckt und in Algorithmen für das Ungefähre Schnur-Zusammenbringen von Esko Ukkonen beschrieben.

Die Erstausgaben des diff Programms wurden für Linienvergleiche von Textdateien entworfen, die das Zeilenvorschubzeichen annehmen, Linien abzugrenzen. Vor den 1980er Jahren ist die Unterstützung für binäre Dateien auf eine Verschiebung auf das Design und Durchführung der Anwendung hinausgelaufen.

Editieren Sie Schrift

Eine editieren Schrift kann noch durch moderne Versionen von diff mit der Auswahl erzeugt werden. Die resultierenden editieren Schrift für dieses Beispiel ist wie folgt:

24a

Dieser Paragraf enthält

wichtige neue Hinzufügungen

zu diesem Dokument.

.

17c

überprüfen Sie dieses Dokument. Auf

.

8,14c

pressen Sie irgendetwas zusammen.

.

0a

Das ist ein wichtiger

bemerken Sie! Es sollte

werden Sie deshalb an gelegen

der Anfang dieses

Dokument!

.</Quelle>

Um den Inhalt der in den Inhalt der Datei ursprünglichen Datei umzugestalten, sollte das neue Verwenden von demjenigen zwei Linien an dieser diff Datei ein anhängen, einen (schreiben) Charakter und ein enthaltend, einen (verlassenen) Charakter (z.B durch) enthaltend. Hier haben wir die diff Datei gegeben, die der Name mydiff und die Transformation dann geschehen werden, wenn Sie laufen

Zusammenhang-Format

Der Vertrieb von Berkeley von Unix hat Gewicht darauf gelegt, das Zusammenhang-Format und die Fähigkeit hinzuzufügen, auf filesystem Verzeichnisstrukturen wiederzufluchen, jene Eigenschaften in 2.8 BSD, veröffentlicht im Juli 1981 hinzufügend. Das Zusammenhang-Format von an Berkeley eingeführtem diff hat mit dem Verteilen von Flecken für den Quellcode geholfen, der minimal geändert worden sein kann.

Im Zusammenhang-Format werden irgendwelche geänderten Linien neben unveränderten Linien vorher und danach gezeigt. Die Einschließung jeder Zahl von unveränderten Linien stellt einen Zusammenhang dem Fleck zur Verfügung. Der Zusammenhang besteht aus Linien, die sich zwischen den zwei Dateien und dem Aufschlag als eine Verweisung nicht geändert haben, um den Platz der Linien in einer modifizierten Datei ausfindig zu machen und zu finden, dass die beabsichtigte Position zur Abwechselung unabhängig davon angewandt wird, ob die Linienzahlen noch entsprechen. Das Zusammenhang-Format führt größere Lesbarkeit für Menschen und Zuverlässigkeit ein, wenn es den Fleck und eine Produktion anwendet, die als Eingang zum Fleck-Programm akzeptiert wird. Dieses intelligente Verhalten ist mit der traditionellen diff Produktion nicht möglich.

Die Zahl von unveränderten Linien, die oben und unter einem Änderungsstück gezeigt sind, kann vom Benutzer, sogar Null definiert werden, aber drei Linien sind normalerweise der Verzug. Wenn der Zusammenhang von unveränderten Linien in einem Stück-Übergreifen mit einem angrenzenden Stück, dann wird diff vermeiden, die unveränderten Linien zu kopieren, und die Stücke in ein einzelnes Stück verschmelzen.

"" Vertritt eine Änderung zwischen Linien, die in den zwei Dateien entsprechen. "" Vertritt die Hinzufügung einer Linie, während ein leerer Raum eine unveränderte Linie vertritt. Am Anfang des Flecks ist die Dateiinformation, einschließlich des vollen Pfads und eines Zeitstempels. Am Anfang jedes Stücks sind die Linienzahlen, die sich um die entsprechende Änderung in den Dateien bewerben. Eine Zahl-Reihe, die zwischen Sätzen von drei Sternchen erscheint, gilt für die ursprüngliche Datei, während Sätze von drei Spuren für die neue Datei gelten. Die Stück-Reihen geben das Starten und Ende von Linienzahlen in der jeweiligen Datei an.

Der Befehl erzeugt die folgende Produktion:

  • /path/to/original Zeitstempel

---/path/to/new-Zeitstempel

  • 1,3 *** *

---1,9----

+ Das ist ein wichtiger

+ bemerken Sie! Es sollte

+ werden Sie deshalb an gelegen

+ der Anfang dieses

+ Dokument!

+

Dieser Teil des

Dokument ist der geblieben

dasselbe von der Version bis

  • 5,20 *** *

werden Sie gezeigt, wenn es nicht tut

Änderung. Sonst, das

würde zu nicht helfen

! pressen die Größe des zusammen

! Änderungen.

!

! enthält Dieser Paragraf

! Text, der überholt ist.

! wird Es im gelöscht

! nahe Zukunft.

Es ist wichtig, zu buchstabieren

! überprüfen diesen dokument. Auf

die andere Hand, ein

falsch buchstabiertes Wort ist nicht

das Ende der Welt.

---11,20----

werden Sie gezeigt, wenn es nicht tut Änderung. Sonst, das würde zu nicht helfen

! pressen irgendetwas zusammen.

Es ist wichtig, zu buchstabieren

! überprüfen dieses Dokument. Auf

die andere Hand, ein falsch buchstabiertes Wort ist nicht das Ende der Welt.
  • 22,24 *** *

---22,28----

dieser Paragraf braucht zu

geändert werden. Dinge können

werden Sie danach hinzugefügt.

+

+ Dieser Paragraf enthält

+ wichtige neue Hinzufügungen

+ zu diesem Dokument.

</Quelle>

Vereinigtes Format

Das vereinigte Format (oder unidiff) erbt die technischen Verbesserungen, die durch das Zusammenhang-Format gebildet sind, aber erzeugt einen kleineren diff mit dem alten und neuen Text präsentiert sofort angrenzend. Vereinigtes Format wird gewöhnlich mit der "" Befehl-Linienauswahl angerufen. Diese Produktion ist häufig als Eingang an das Fleck-Programm gewöhnt. Viele Projekte bitten spezifisch, dass "diffs" im vereinigten Format vorgelegt werden, hat das Machen Diff-Format der grösste Teil des Standardformates für den Austausch zwischen Softwareentwicklern vereinigt.

Vereinigter Zusammenhang diffs wurde von Wayne Davison im August 1990 ursprünglich entwickelt (in unidiff, der im Band 14 von comp.sources.misc erschienen ist). Richard Stallman hat vereinigte Diff-Unterstützung zum diff Dienstprogramm des Projektes des GNUS einen Monat später hinzugefügt, und die Eigenschaft hat im GNU diff 1.15, veröffentlicht im Januar 1991 debütiert. GNU diff hat das Zusammenhang-Format seitdem verallgemeinert, um willkürliche Formatierung von diffs zu erlauben.

Das Format fängt mit demselben Zwei-Linien-Kopfball wie das Zusammenhang-Format an, außer dass der ursprünglichen Datei durch "" vorangegangen wird und der neuen Datei durch "" vorangegangen wird. Im Anschluss daran sind ein oder mehr Änderungsstücke, die die Linienunterschiede in der Datei enthalten. Den unveränderten Kontextlinien wird durch einen Raumcharakter vorangegangen, Hinzufügungslinien wird durch ein Pluszeichen vorangegangen, und Auswischen-Linien wird durch minus das Zeichen vorangegangen.

Ein Stück beginnt mit der Reihe-Information und wird mit den Linienhinzufügungen, dem Linienauswischen und jeder Zahl der Kontextlinien sofort gefolgt. Die Reihe-Information wird durch den doppelten - an Zeichen umgeben, und verbindet auf eine einzelne Linie, was auf zwei Linien im Zusammenhang-Format (oben) erscheint. Das Format der Reihe-Informationslinie ist wie folgt:

@@-l, s +l, s @@ fakultative Abteilung, die geht

Die Stück-Reihe-Information enthält zwei Stück-Reihen. Der Reihe für das Stück der ursprünglichen Datei wird durch minus das Symbol vorangegangen, und der Reihe für die neue Datei wird durch plus das Symbol vorangegangen. Jede Stück-Reihe ist des Formats l, s, wo l die Startlinie-Zahl ist und s die Zahl von Linien ist, für die das Änderungsstück für jede jeweilige Datei gilt. In vielen Versionen des GNUS diff kann jede Reihe das Komma und Schleppen des Werts s, in welchem Fall s Verzug zu 1 weglassen. Bemerken Sie, dass der einzige wirklich interessante Wert die l Linienzahl des ersten anordnet ist; alle anderen Werte können vom diff geschätzt werden.

Die Stück-Reihe für das Original sollte die Summe von allen Kontext- und Auswischen (einschließlich des geänderten) Stück-Linien sein. Die Stück-Reihe für die neue Datei sollte eine Summe von allen Kontext- und Hinzufügung (einschließlich des geänderten) Stück-Linien sein. Wenn Stück-Größe-Information der Zahl von Linien im Stück nicht entspricht, dann konnten die diff ungültig betrachtet werden und werden zurückgewiesen.

Fakultativ kann der Stück-Reihe vom Kopfstück der Abteilung oder Funktion gefolgt werden, deren das Stück ein Teil ist. Das ist hauptsächlich nützlich, um das diff leichtere zu machen, um zu lesen. Wenn man einen diff mit dem GNU diff schafft, wird das Kopfstück durch das regelmäßige Ausdruck-Zusammenbringen identifiziert..

Wenn eine Linie modifiziert wird, wird sie als ein Auswischen und Hinzufügung vertreten. Da die Stücke der ursprünglichen und neuen Datei in demselben Stück erscheinen, würden solche Änderungen neben einander erscheinen.

Ein Ereignis davon im Beispiel ist unten:

- überprüfen Sie diesen dokument. Auf

+check dieses Dokument. Auf

Der Befehl erzeugt die folgende Produktion:

---/path/to/original-Zeitstempel

+++/path/to/new-Zeitstempel

@@-1,3 +1,9 @@

+This ist ein wichtiger

+notice! Es sollte

+therefore, an gelegen werden

+the-Anfang dieses

+document!

+

Dieser Teil des

Dokument ist der geblieben

dasselbe von der Version bis

@@-5,16 +11,10 @@

werden Sie gezeigt, wenn es nicht tut

Änderung. Sonst, das

würde zu nicht helfen

- pressen Sie die Größe des zusammen

- Änderungen.

-

- Dieser Paragraf enthält

- Text, der überholt ist.

- Es wird im gelöscht

- nahe Zukunft.

+compress irgendetwas.

Es ist wichtig, zu buchstabieren

- überprüfen Sie diesen dokument. Auf

+check dieses Dokument. Auf

die andere Hand, ein

falsch buchstabiertes Wort ist nicht

das Ende der Welt.

@@-22,3 +22,7 @@

dieser Paragraf braucht zu

geändert werden. Dinge können

werden Sie danach hinzugefügt.

+

+This-Paragraf enthält

+important neue Hinzufügungen

+to dieses Dokument.

</Quelle>

Es gibt einige Modifizierungen und Erweiterungen auf die Diff-Formate, die verwendet und durch bestimmte Programme und in bestimmten Zusammenhängen verstanden werden. Zum Beispiel geben einige Revisionsregelsysteme — wie Umsturz — eine Versionsnummer, "Arbeitskopie" oder jede andere Anmerkung statt eines Zeitstempels in der Kopfball-Abteilung des diff an.

Einige Werkzeuge erlauben diffs für mehrere verschiedene Dateien, in eine mit einem Kopfball für jede modifizierte Datei verschmolzen zu werden, die etwas wie das schauen kann:

Index: path/to/file.cpp

Der spezielle Fall, mit Dateien, die in einem newline nicht enden, wird nicht behandelt. Weder das unidiff Dienstprogramm noch der POSIX diff Standard definieren eine Weise, diesen Typ von Dateien zu behandeln.

Das Fleck-Programm ist sogar einer Durchführung spezifische diff Produktion nicht bewusst.

Andere

Postverarbeiter sdiff und diffmk machen nebeneinander diff Auflistungen und angewandte Änderungszeichen zu gedruckten Dokumenten beziehungsweise. Beide wurden anderswohin in Glockenlaboratorien in oder vor 1981 entwickelt.

Diff3 vergleicht eine Datei gegen zwei andere Dateien. Es wurde von Paul Jensen ursprünglich entwickelt, um Änderungen beizulegen, die von zwei Menschen vorgenommen sind, die eine allgemeine Quelle editieren. Es wird auch innerlich durch viele Revisionsregelsysteme verwendet.

GNU diff und diff3 werden ins diffutils Paket mit anderem diff eingeschlossen und flicken verwandte Dienstprogramme. Emacs hat Ediff, für die Änderungen zu zeigen, die ein Fleck in einer Benutzerschnittstelle zur Verfügung stellen würde, die das interaktive Redigieren und Mischen von Fähigkeiten für Fleck-Dateien verbindet.

Wdiff zeigt die Wörter oder Ausdrücke, die sich in ein Textdokument der geschriebenen Sprache sogar in Gegenwart von wortwickelnden oder verschiedenen Säulenbreiten geändert haben. Spiff vergleicht Dateien, aber ignoriert Schwimmpunkt-Unterschiede mit der stimmbaren Präzision und weist irrelevanten Code wie whitespace und Anmerkungsformatierung ab. Dienstprogramme, die Quelldateien durch ihre syntaktische Struktur vergleichen, sind größtenteils als Forschungswerkzeuge für einige Programmiersprachen gebaut worden; einige sind als kommerzielle Werkzeuge verfügbar. Werkzeuge bestehen, um HTML zu vergleichen, und für XML sind von Microsoft und IBM veröffentlicht worden.

Freie Dateivergleich-Werkzeuge

Siehe auch

  • Vergleich von Dateivergleich-Werkzeugen
  • Delta, das verschlüsselt
  • Unterschied-Maschinenbediener
  • Editieren Sie Entfernung
  • Entfernung von Levenshtein
  • Geschichte des Softwarekonfigurationsmanagements
  • Längstes allgemeines Subfolge-Problem
  • Microsoft File Compare
  • Revisionskontrolle
  • Softwarekonfigurationsmanagement

Referenzen

Links


Sandmännchen / Ecotourism
Impressum & Datenschutz