Die Veröffentlichung des verteilten Versionskontrollsystems Git 2.56 wurde vorgestellt. Der Git-Code wird unter der GPLv2+-Lizenz veröffentlicht. Im Vergleich zur vorherigen Version wurden 748 Ănderungen in die neue Version aufgenommen, die von 104 Entwicklern vorgenommen wurden, von denen 39 erstmals an der Entwicklung von Git beteiligt sind. Die wichtigsten Neuerungen (1, 2, 3):
- Der Modus âgit add âresolvedâ wurde hinzugefĂŒgt, um Konflikte bei Merges aufzulösen. Dieser ĂŒberprĂŒft Dateien auf Konfliktmarker und gibt im Fall eines Markers in einer Datei einen Fehler aus, indiziert keine der Dateien und zeigt eine Liste von Dateien an, die korrigiert werden mĂŒssen. Im Gegensatz zum Befehl âgit add âupdateâ werden im neuen Modus nur die Dateien behandelt, die sich im Konfliktstatus befinden, wĂ€hrend unverknĂŒpfte geĂ€nderte Dateien ignoriert werden. Dies ermöglicht es, Merges sicher abzuschlieĂen, selbst wenn im Arbeitsverzeichnis andere unvollendete Ănderungen vorhanden sind (der Befehl âgit add âupdateâ fĂŒgte alle vorher verfolgten geĂ€nderten Dateien im Arbeitsverzeichnis dem Index hinzu).
- Die Arbeit mit groĂen Repositories wurde erheblich beschleunigt, dank der Optimierung des Algorithmus zur Suche nach den letzten gemeinsamen Commits wĂ€hrend Merges und beim Vergleichen von Commits. Bei der Verarbeitung werden nun auch Commits berĂŒcksichtigt, die ausschlieĂlich einer der Branches gehören, was es ermöglicht, die Suche sofort zu stoppen, sobald alle möglichen gemeinsamen VorgĂ€nger gefunden sind, ohne Zeit mit einer weiteren Durchsuchung des Ănderungsverlaufs zu verlieren. In einem der getesteten Repositories stieg die Suchgeschwindigkeit im Durchschnitt um das 20-Fache, in einem anderen erreichte die Beschleunigung das 70-Fache. Bei der AusfĂŒhrung des Befehls âgit merge-base âall v4.8 v4.9â reduzierte sich die Anzahl der Durchlauf-Schritte in einem Repository mit dem Linux-Kernel von 167.000 auf 3.800.
- FĂŒr serverseitige Anwendungen wurde der Modus ââpath-walkâ angepasst, der ermöglicht, kompaktere Pack-Dateien durch Gruppierung von Objekten nach ihrem Pfad im Verzeichnisbaum zu erstellen (zum Beispiel reduzierte beim Repository Fluent UI die Verwendung von ââpath-walkâ die GröĂe der Pack-Datei von 558 MB auf 164 MB). In der neuen Version wurde die Möglichkeit implementiert, den Modus ââpath-walkâ zusammen mit Erreichbarkeits-Bitmaps und Delta-Inseln zu verwenden, die von Git-Hosting-Diensten zur Beschleunigung der Arbeit und zur Isolation von Forks vom Hauptrepository eingesetzt werden.
- Engpassprobleme, die zu ĂŒbermĂ€Ăigen Berechnungen in groĂen Repositories fĂŒhrten, wurden behoben: ĂberflĂŒssige StatusĂŒberprĂŒfungen von Dateien beim Schreiben in die Reftabelle wurden entfernt; das wiederholte Scannen der Liste bei jedem HinzufĂŒgen einer neuen Pack-Datei wurde ausgeschlossen; Operationen mit der Reftabelle, in denen viele LöschdatensĂ€tze angesammelt wurden, wurden beschleunigt; die Arbeit mit âgit diffâ wurde optimiert, wenn EinschrĂ€nkungen bezĂŒglich der Dateipfade angegeben werden. Nach den Optimierungen hat sich die Arbeit mit der Reftabelle bei einer hohen Anzahl von Löschungen um das 65-fache beschleunigt (von 13 Sekunden auf 0,2 Sekunden), und die AusfĂŒhrung des problematischen Befehls âgit diffâ im Chromium-Repository mit 500.000 Elementen im Index benötigt nun 0,07 Sekunden statt 8 Minuten.
- Das experimentelle Team âgit historyâ, das Möglichkeiten zur Neuaufzeichnung der Ănderungsverlauf bietet, hat die Operation âgit history dropâ hinzugefĂŒgt, um einen bestimmten Commit zu löschen und seine Nachfolger automatisch an den Eltern-Commit anzuhĂ€ngen.
- Der Befehl âgit branch âdelete-merged âorigin alfâ âtopic-*'â wurde hinzugefĂŒgt, um sicher Gruppen lokaler Zweige zu löschen, deren Ănderungen bereits an das externe Repository ĂŒbergeben wurden. Masken dĂŒrfen fĂŒr die Filterung von Zweigen und Repositories verwendet werden. Zum Analysieren der in Frage kommenden Elemente zur Löschung, ohne die Operation tatsĂ€chlich durchzufĂŒhren, kann das Flag ââdry-runâ verwendet werden.
- Der Befehl âgit refs create|update|delete|renameâ wurde hinzugefĂŒgt, um niedrigstufige Operationen zum Erstellen, Löschen, Umbenennen und Aktualisieren von Referenzen zu kombinieren.
- Der Option ââreset-when-found=[]â wurde zum Befehl âgit bisect runâ hinzugefĂŒgt, die das Repository automatisch in den Zustand vor Beginn der Suche zurĂŒckfĂŒhrt oder den problematischen Commit aktiv bleibt, ohne den Befehl âgit bisect resetâ separat ausfĂŒhren zu mĂŒssen.
- Dem Befehl âgit replayâ wurde die Option ââlinearizeâ hinzugefĂŒgt, um eine flache Merge-Topologie zu verwenden, analog zu âgit rebase âno-rebase-mergesâ, jedoch ohne auf das Arbeitsverzeichnis zuzugreifen.
- Im Befehl âgit log âfollowâ wurde die Verfolgung von Umbenennungen von Dateien in nichtlinearen ĂnderungsverlĂ€ufen implementiert, z. B. bei der ZusammenfĂŒhrung von Unterzweigen. Der Pfad zur Datei wird nun separat fĂŒr jeden ĂŒbergeordneten Commit festgehalten, was das Ergebnis unabhĂ€ngig von der Reihenfolge des Durchlaufs durch die Commit-Historie macht.
- Die Möglichkeit, den Befehl âgit repack -a âfilter=blob:limit=1m âdrop-filteredâ anzuwenden, wurde hinzugefĂŒgt, um groĂe Blob-Objekte, die bei Bedarf aus einem externen Repository geladen werden und im aktuellen Index nicht verwendet werden, zu entfernen. Bei einem spĂ€teren Zugriff auf diese Objekte werden sie automatisch erneut geladen.
- In dem Befehl âgit log âgraphâ wurde fĂŒr Graphen mit mehreren unabhĂ€ngigen Wurzeln die HinzufĂŒgung von EinrĂŒckungen zur klaren Trennung nicht verbundener Commits umgesetzt.
- Die Erkennung typischer Tippfehler wurde sichergestellt, wie z.B. die Angabe von âgit push origin/mainâ anstelle von âgit push origin mainâ oder âgit branch âset-upstream-to origin mainâ anstelle von âgit branch âset-upstream-to=origin/mainâ sowie eineæç€ș fĂŒr die Verwendung der korrekten Variante.
Quelle: opennet.ru
