2010-02-25 5 views
47

Ich habe das Subversion-Buch gelesen und es ist mir klar, dass Subversion nicht einzelne Dateien, sondern nur Deltas speichert, um Speicherplatz zu sparen. Subversion macht dasselbe auch mit Binärdateien (das war früher eine große Schwäche von CVS).Wie genau speichert Subversion Dateien im Repository?

Allerdings verstehe ich nicht den genauen Mechanismus. Wann begehe ich eine Datei, was passiert?

  1. Subversion speichert nur die diff (und hat bereits die alte Version)
  2. Subversion die vorherige Version löscht, speichert die neue Datei intakt und erzeugt eine umgekehrte diff, um „neu zu erstellen“, um die alte Version, wenn erforderlich.
  3. Etwas anderes, an das ich nicht gedacht habe.

Der erste Fall scheint am logischsten zu sein. Dies wirft jedoch eine andere Frage auf. Wenn ich in einem Subversion-Repository eine Datei mit 1000 Commits habe und ein neuer Entwickler eine saubere Kopie auscheckt, müsste Subversion die Originalversion (Initial Import) holen und 1000 diffs anwenden, bevor das Ergebnis zurückgegeben wird. Ist das richtig? Gibt es eine Art Caching für Dateien, in denen auch die neueste Version gespeichert wird?

Grundsätzlich wo finde ich Informationen zu den Interna des SVN-Repositorys?

Update: Anscheinend spielt das Backend der Subversion eine große Rolle. Zu der Zeit oder schreiben FSFS Option 1 verwendet, während BDB Option 2 verwendet. Danke msemack!

+0

Minor Korrektur zu verstehen: „Spätere Versionen von Subversion auch das gleiche mit binären Dateien als auch“. Subversion hat dies IMMER getan (mindestens so weit zurück wie Version 0.3.x). –

+1

möglich Duplikat von [SVN-Leistung nach vielen Revisionen] (http://stackoverflow.com/questions/127692/svn-performance-after-many-revisions) –

+0

Ich finde das auch sehr verwirrend. Es gibt mehrere Backends, bdb und fsfs. Dann gibt es Dokumente über "bubble up", "hip-delta", die sich zu widersprechen scheinen. Wie speichert ein Standard-SVN Repo seine Dateien? – Thomas

Antwort

12

Da das Repository-Format von Subversion vollständig intern ist, steht es ihnen frei, die Darstellung von einer Revision zur nächsten zu ändern. Ich glaube, die aktuelle Revision speichert im Allgemeinen umgekehrte Deltas (Ihre Option 2), speichert aber auch regelmäßig komplette Snapshots, so dass 1000 Diffs nicht aufgelöst werden müssen, bevor ein Ergebnis zurückgegeben wird.

Die Versionshinweise zu Subversion 1.6 enthalten einen Abschnitt zu Filesystem storage improvements, der einige Hinweise dazu und Links zu anderen Quellen enthält. Es genügt zu sagen, dass die Details des Subversion-Datenspeichers komplex sind und sich ändern können.

Es gibt auch ein Entwurfsdokument in der Subversion-Quellenstruktur, das die Verwendung von skip deltas in Subversion beschreibt. Im Allgemeinen enthält das Verzeichnis /notes/ mehrere nützliche Dokumente zu Subversion-Interna.

7

Vom Subversion Design Dokument (die ziemlich veraltet ist, obwohl) Sie können diese:

Wie viele andere Versionskontrollsystemen, Subversion speichert Änderungen als Unterschiede. Es macht keine vollständigen Kopien von Knoten; Stattdessen speichert es die neueste Revision als Volltext und frühere Revisionen als eine Folge von umgekehrten Diffs (das Wort "diff" wird hier lose verwendet) - für Dateien bedeutet es vdeltas, für Verzeichnisse bedeutet es ein Format, das Änderungen ausdrückt Verzeichnisse).

Ich glaube nicht, dass das seit geändert wurde.

Siehe auch Bubble-Up Method.

+3

Das Entwurfsdokument, mit dem Sie verknüpft sind, bezieht sich auf das alte Berkeley DB-Datenbankformat, das SVN nicht mehr als Standard verwendet. –

1

Jedes Mal, wenn Sie eine Änderung zu übernehmen, die Repository speichert eine neue Version von dass insgesamt Repository-Struktur und Etiketten der neue Baum mit einer neuen Revisionsnummer. Natürlich ist der Großteil der der gleiche Baum wie die Revision vor, außer für die Teile, die Sie geändert haben.

Die neue Versionsnummer ist ein sequentielles Label, das auf den gesamten neuen Baum gilt, nicht nur auf die Dateien und Verzeichnisse Sie in dieser Revision berühren. Umgangssprachlich wird jedoch eine Revisionsnummer verwendet, um auf die Änderung zu verweisen, die in dieser Revision begangen wurde; zum Beispiel „die Änderung in r588“ („r588“ ist eine Abkürzung für „Revision 588“) wirklich bedeutet „die Differenz zwischen Repository Bäumen 587 und 588“, oder anders gesagt „, machte die Änderung zu Baum 587, um den Baum 588 zu erzeugen. "

Werfen Sie einen Blick auf: Subversion FAQ

3

die regelmäßige FSFS Spezifikation könnte Ihnen helfen.

Oder wenn Sie Berkeley DB, here's die Spezifikation dafür verwenden.

FSFS verwendet umgekehrte Deltas, um die Änderungen zu speichern und skip-deltas, um einige Aktionen zu beschleunigen, wenn ich alles richtig verstanden habe.