Unterstützt von rund 70 Entwicklern ist Git 2.11 erschienen. Das kürzt nun SHA-1-Hashes intelligenter ab und optimiert den Zugriff auf so genannte Delta Chains.
Für Objekte nutzt Git üblicherweise SHA-1-Hashes, die sehr lang werden können. Der Vorteil ist: Kollisionen treten dabei so gut wie nicht auf. Der Nachteil: Im täglichen Umgang sind die Hashes nicht sehr praktikabel. Also haben die Entwickler sie aus Gründen der Handhabbarkeit verkürzt. Neues Problem: Kollisionen bei verkürzten Hashes treten wesentlich häufiger auf. Daher checkt Git stellenweise Ähnlichkeiten der Hashes, bis es auf Unterschiede trifft.
Wachsen die Projekte allerdings, kommt es vor, dass die verkürzten Hashes doppelt auftreten. Und ein stark wachsendes Projekt ist der Linux-Kernel, für den Git erfunden wurde. Git 2.11 will auf solche Konflikte reagieren, indem es mitwachsende Abkürzungen für Commits und Bug Reports wählt, die länger werden, wenn das Repository wächst. Stößt Git doch mal auf doppelte Hashes, zeigt es nun beide an und der User darf sich für eines davon entscheiden. Oder Git erkennt von allein, welches Objekt der User meint, dank der etwa in “git log” eingebauten Intelligenz.
Auch an der Performance haben die Entwickler geschraubt, was Git Performance-Gewinne im Umgang mit Delta Chains beschert. Den Hintergrund erklärt das ausführliche Changelog sehr schön. Die kurze Version: Um Platz zu sparen, speichert Git Inhalte in Form von Objekten, die den Namen von Hashes tragen. Identische Inhalte muss die Software so nur ein Mal speichern. Bei nur leichten Abweichungen heißt das abweichende Objekt Delta. Sein Inhalt besteht aus einem Verweis auf das ähnliche Objekt und einer Auflistung der dazu bestehenden Abweichungen (etwa “remove Bytes 50-100”). Ändern sich Inhalte, entstehen Ketten solcher Verweise mit bis zu 50 Objekten, die Delta Chains.
Diese Chains reduziert Git bei einem aggressiven Repack vom aktuellen Default-Wert 250 auf 50, was die CPU besser verträgt. Zudem wurde der “deltaBaseCache”, der diese Deltas puffert, überarbeitet was Operationen in Repositories teils deutlich beschleunigt.
Auch einen Cache für die Suche nach Objekten über Packfiles haben die Entwickler eingerichtet, der das Repacking messbar schneller macht. Git prozessiert zudem Patch IDs, die wichtig für “git rebase” sind, schneller. Ein neues Protokoll beschleunigt Checkouts, indem Git Overhead beim Kommunizieren mit den Filterprogrammen einspart. Das komplette Changelog findet sich in einem Blogeintrag auf Github, wo auch die neue Version zu finden ist.





