Wie genau funktioniert Subversion Speichern von Dateien im Repository?
-
22-09-2019 - |
Frage
lese ich das Subversion Buch, und es ist mir klar, dass Subversion einzelne Dateien nicht speichern, sondern nur Deltas, um Speicherplatz zu minimieren. Subversion hat auch das gleiche mit Binär-Dateien als auch (diese verwendeten eine große Schwäche von CVS zu sein).
Allerdings verstehe ich nicht, den genauen Mechanismus. Wenn ich begehen eine Datei, was passiert?
- Subversion speichert nur die diff (und hat bereits die alte Version)
- Subversion löscht die vorherige Version, speichert die neue Datei intakt und erzeugt eine umgekehrte diff, um „neu zu erstellen“, um die alte Version, wenn nötig.
- Etwas anderes, dass ich nicht gedacht haben.
Der erste Fall könnte die logischste zu sein scheint. Dies wirft jedoch eine andere Frage. Wenn ich in einem Subversion-Repository eine Datei mit 1000 Commits und einem neuen Entwickler checkt eine saubere Kopie haben, dann würde Subversion müssen die ursprüngliche Version (Anfangs Import) abzurufen und anzuwenden 1000 diffs auf diese, bevor das Ergebnis zurück. Ist das richtig? Gibt es irgendeine Art von Caching für Dateien, in denen die neueste Version auch gehalten wird?
Im Grunde genommen, wo kann ich Informationen über die SVN-Repository Interna finden?
Update: Anscheinend ist das Back-End der Subversion spielt eine große Rolle. Damals oder Schreiben von FSFS verwendet Option 1, während BDB verwendet Option 2. Dank msemack!
Lösung
Da Subversion-Repository-Format vollständig intern ist, sind sie frei, die Darstellung von einer Revision zum nächsten zu ändern. Ich glaube, dass die aktuelle Revision der Regel speichert Reverse Deltas (Ihre Option 2), sondern auch speichert komplette Schnappschüsse in regelmäßigen Abständen, damit es nicht 1000 diffs zu lösen, bevor ein Ergebnis zurück.
Die Subversion 1.6 Release Notes hat einen Abschnitt Dateisystem-Speicher Verbesserungen dass hat einige Hinweise dazu, und Links zu anderen Quellen. Es genügt zu sagen, dass die Details von Subversion Datenspeicherung sind komplex und Änderungen vorbehalten.
Es gibt auch ein Design-Dokument in dem Subversion-Quellbaum, der die Verwendung von skip Deltas in Subversion . Im Allgemeinen ist die / notes / Verzeichnis enthält einige nützliche Dokumente in Bezug auf Subversion Interna .
Andere Tipps
Ich glaube, die folgende Verbindung der Unterstützung wäre die fsfs Architektur
zu verstehenhttp://svn.apache.org/repos/ asf / subversion / trunk / subversion / libsvn_fs_fs / Struktur
Aus dem Subversion Entwurf Dokument ( die ganz datiert ist, obwohl) Sie dieses nicht erhalten:
Wie viele andere Versionskontrollsystemen, ändert Subversion speichert als Unterschiede. Es macht nicht vollständige Kopien von Knoten; stattdessen es die neueste Version als Volltext und frühere Versionen als eine Abfolge von Reverse-diffs speichert (das Wort „diff“ losen hier verwendet wird - für Dateien, bedeutet vdeltas, für Verzeichnisse, es bedeutet, ein Format, dass Änderungen zum Ausdruck bringt an Verzeichnisse).
Ich glaube nicht, dass da geändert.
Auch finden Sie unter Bubble-Up-Methode .
die regelmäßige FSFS Spezifikation könnte Ihnen helfen .
Oder wenn Sie Berkeley DB verwenden, hier die Spezifikation für die.
FSFS verwendet Reverse Deltas um die Änderungen zu speichern und skip- Deltas einige Aktionen zu beschleunigen, wenn ich alles richtig verstanden.
Jedes Mal, wenn Sie eine Änderung zu übernehmen, die Repository speichert eine neue Revision dass insgesamt Repository-Struktur und Etiketten den neuen Baum mit einem neuen Revisionsnummer. Natürlich, die meisten der Baum ist das gleiche wie die Revision vor, mit Ausnahme der Teile, die Sie geändert.
Die neue Versionsnummer ist ein sequentielles Schilds am gilt gesamter neuer Baum, nicht nur auf die Dateien und Verzeichnisse berührt Sie, dass Revision. Allerdings umgangssprachlich, ein Revisionsnummer wird verwendet, um zu bezeichnen, die Änderung in dieser Revision verpflichtet; zum Beispiel „die Änderung in r588“ ( „R588“ ist eine Abkürzung für „Revision 588" ) wirklich bedeutet, „den Unterschied zwischen Repository Bäumen 587 und 588" , oder anders gesagt, „die Änderung vorgenommen zu Baum 587 Baum 588" zu erzeugen.
Hier finden Sie: Subversion FAQ