Facebook (in der Russischen Föderation verboten) veröffentlichte das Quellcodeverwaltungssystem Sapling, das bei der Entwicklung interner Unternehmensprojekte verwendet wird. Ziel des Systems ist es, eine vertraute Versionskontrollschnittstelle bereitzustellen, die fĂŒr sehr groĂe Repositorys mit mehreren zehn Millionen Dateien, Commits und Branches skalierbar ist. Der Client-Code ist in Python und Rust geschrieben und steht unter der GPLv2-Lizenz.
FĂŒr effizientes Remote-Arbeiten mit Repositories wurde eine separate Serverkomponente entwickelt. Zudem steht ein virtuelles Dateisystem zur VerfĂŒgung, mit dem ein lokaler Ausschnitt eines Repositorys wie ein vollstĂ€ndiges Repository bearbeitet werden kann (der Entwickler sieht das gesamte Repository, aber nur die angeforderten Daten werden lokal kopiert). Der Code fĂŒr diese in der Facebook-Infrastruktur verwendeten Komponenten ist noch nicht Open Source, das Unternehmen hat jedoch eine Veröffentlichung fĂŒr die Zukunft angekĂŒndigt. Prototypen sind bereits im Sapling-Repository verfĂŒgbar. Server Mononoke (geschrieben in Rust) und VFS EdenFS (geschrieben in C++) sind optionale Komponenten. Ebenso der Sapling-Client, der das Klonen von Git-Repositories und die Interaktion mit diesen unterstĂŒtzt. Server basiert auf Git LFS und arbeitet mit Git-Hosting-Diensten wie GitHub zusammen.
Die Hauptidee des Systems besteht darin, dass bei der Interaktion mit einem speziellen Serverteil, der die Speicherung des Repositorys bereitstellt, alle VorgĂ€nge in AbhĂ€ngigkeit von der Anzahl der Dateien skaliert werden, die tatsĂ€chlich im Code verwendet werden, an dem der Entwickler arbeitet, und nicht davon abhĂ€ngen die GesamtgröĂe des gesamten Repositorys. Beispielsweise verwendet ein Entwickler möglicherweise nur einen kleinen Teil des Codes aus einem sehr groĂen Repository und nur dieser kleine Teil wird auf sein System migriert, nicht das gesamte Repository. Das Arbeitsverzeichnis wird dynamisch gefĂŒllt, wenn auf Dateien aus dem Repository zugegriffen wird, was Ihnen einerseits eine deutliche Beschleunigung der Arbeit mit Ihrem Teil des Codes ermöglicht, andererseits aber auch zu einer Verlangsamung beim Zugriff auf neue Dateien fĂŒr den fĂŒhrt zum ersten Mal und erfordert stĂ€ndigen Zugriff auf das Netzwerk (separat bereitgestellter und Offline-Modus zur Vorbereitung von Commits).
ZusĂ€tzlich zum adaptiven Laden von Daten implementiert Sapling Optimierungen, die darauf abzielen, das Laden von Informationen mit Ănderungshistorie zu reduzieren (beispielsweise 3/4 der Daten im Repository mit dem Kern). Linux (Dies bezieht sich auf den Ănderungsverlauf.) Um effizient mit dem Ănderungsverlauf arbeiten zu können, werden die zugehörigen Daten segmentiert gespeichert. Dadurch können einzelne Teile des Commit-Graphen vom Server heruntergeladen werden. Der Client kann Informationen ĂŒber die Beziehungen zwischen mehreren Commits vom Server anfordern und nur den benötigten Teil des Graphen herunterladen.
Das Projekt wurde in den letzten 10 Jahren weiterentwickelt und wurde geschaffen, um Probleme bei der Organisation des Zugriffs auf sehr groĂe monolithische Repositorys mit einem Master-Zweig zu lösen, der den âRebaseâ-Vorgang anstelle von âMergeâ verwendete. Zu diesem Zeitpunkt gab es keine offenen Lösungen fĂŒr die Arbeit mit solchen Repositories, und Facebook-Ingenieure beschlossen, ein neues Versionskontrollsystem zu entwickeln, das den Anforderungen des Unternehmens gerecht wurde, anstatt Projekte in kleine Repositories aufzuteilen, was zu einer KomplexitĂ€t von fĂŒhren wĂŒrde AbhĂ€ngigkeitsmanagement (um ein Ă€hnliches Problem zu lösen, hat Microsoft einst die GVFS-Schicht erstellt). ZunĂ€chst nutzte Facebook das Mercurial-System und entwickelte in der ersten Phase das Sapling-Projekt als ErgĂ€nzung zu Mercurial. Im Laufe der Zeit wandelte sich das System zu einem eigenstĂ€ndigen Projekt mit eigenem Protokoll, Speicherformat und eigenen Algorithmen, das zudem um die Möglichkeit zur Interaktion mit Git-Repositories erweitert wurde.
FĂŒr die Arbeit wird ein Befehlszeilendienstprogramm âslâ angeboten, das typische Konzepte, ArbeitsablĂ€ufe und eine Schnittstelle implementiert, die Entwicklern bekannt ist, die mit Git und Mercurial vertraut sind. Die Terminologie und Befehle in Sapling unterscheiden sich geringfĂŒgig von Git und Ă€hneln eher Mercurial. Anstelle von Zweigen werden beispielsweise âLesezeichenâ verwendet (benannte Zweige werden nicht unterstĂŒtzt). StandardmĂ€Ăig wird beim AusfĂŒhren von Klonen/Pull nicht das gesamte Repository geladen, sondern nur der Hauptzweig. Es gibt keine vorlĂ€ufige Markierung von Commits ( Staging-Bereich), statt âgit fetchâ wird der âslâ-Befehl verwendet pullâ, statt âgit pullâ â âsl pull -rebaseâ, statt âgit checkout COMMITâ â âsl goto COMMITâ, statt âgit reflogâ â âsl journalâ, um eine Ănderung abzubrechen, anstelle von âgit checkout â FILEâ wird âsl revert FILEâ angegeben und â.â wird verwendet, um den âHEADâ-Zweig zu identifizieren. Aber im Allgemeinen bleiben die allgemeinen Konzepte von Verzweigungen und Klon-/Pull-/Push-/Commit-/Rebase-Operationen erhalten.
Unter den zusĂ€tzlichen Funktionen des Sapling-Toolkits sticht die UnterstĂŒtzung von âSmartlogâ hervor, mit der Sie den Zustand Ihres Repositorys visuell beurteilen, die wichtigsten Informationen hervorheben und unwichtige Details herausfiltern können. Wenn Sie beispielsweise das Dienstprogramm sl ohne Argumente ausfĂŒhren, werden nur Ihre eigenen lokalen Ănderungen auf dem Bildschirm angezeigt (andere werden minimiert), der Status externer Zweige, geĂ€nderter Dateien und neue Versionen von Commits werden angezeigt. ZusĂ€tzlich wird eine interaktive WeboberflĂ€che angeboten, die eine schnelle Navigation durch das Smart Log, den Ănderungsbaum und die Commits ermöglicht.

Eine weitere bemerkenswerte Verbesserung von Sapling besteht darin, dass es einfacher ist, Fehler zu beheben und zu einem frĂŒheren Zustand zurĂŒckzukehren. Beispielsweise werden die Befehle âsl undoâ, âsl redoâ, âsl uncommitâ und âsl unamendâ angeboten, um viele VorgĂ€nge rĂŒckgĂ€ngig zu machen; die Befehle âsl hideâ und âsl unhideâ werden verwendet, um Commits vorĂŒbergehend auszublenden; und zur interaktiven Navigation durch alte ZustĂ€nde und RĂŒckkehr zum angegebenen Punkt mit dem Befehl âsl undo -i commandâ. Sapling unterstĂŒtzt auch das Konzept eines Commit-Stacks, mit dem Sie schrittweise ĂberprĂŒfungen organisieren können, indem Sie komplexe Funktionen in eine Reihe kleinerer, verstĂ€ndlicherer inkrementeller Ănderungen aufteilen (von einem GrundgerĂŒst bis zu einer fertigen Funktion).
FĂŒr Sapling wurden mehrere ErgĂ€nzungen vorbereitet, darunter die ReviewStack-Schnittstelle zum ĂberprĂŒfen von Ănderungen (Code unter GPLv2), die es Ihnen ermöglicht, Pull-Anfragen auf GitHub zu verarbeiten und eine Stapelansicht der Ănderungen zu verwenden. DarĂŒber hinaus wurden ErgĂ€nzungen zur Integration mit VSCode- und TextMate-Editoren sowie zur Implementierung der ISL-Schnittstelle (Interactive SmartLog) und des Servers veröffentlicht.
Source: opennet.ru
