Nach zwei Monaten intensiver Entwicklung wurde die Version 2.35 des verteilten Versionskontrollsystems Git veröffentlicht. Git gehört zu den bekanntesten, zuverlässigsten und leistungsstärksten Versionskontrollsystemen und bietet flexible Tools für nicht-lineare Entwicklung, die auf Branching und Merging basieren. Um die Integrität der Historie und die Stabilität gegenüber nachträglichen Änderungen zu gewährleisten, wird eine implizite Hashfunktion für die gesamte vorherige Historie in jedem Commit verwendet. Zudem können einzelne Tags und Commits durch digitale Signaturen der Entwickler verifiziert werden.
Im Vergleich zur vorherigen Version wurden 494 Änderungen übernommen, die von 93 Entwicklern vorbereitet wurden, darunter 35, die zum ersten Mal an der Entwicklung teilgenommen haben. Zu den Hauptneuheiten gehören:
- Die Nutzungsmöglichkeiten von SSH-Schlüsseln zur Signierung von Git-Objekten wurden erweitert. Um die Gültigkeitsdauer mehrerer Schlüssel zu unterscheiden, wurde die Unterstützung der OpenSSH-Direktiven „valid-before“ und „valid-after“ eingeführt. Diese gewährleisten die ordnungsgemäße Verarbeitung von Signaturen nach dem Wechsel eines Entwicklers zu einem neuen Schlüssel. Zuvor gab es ein Problem beim Trennen von Signaturen mit dem alten und dem neuen Schlüssel: Wenn der alte Schlüssel gelöscht wurde, konnten alle damit erstellten Signaturen nicht mehr überprüft werden. Wenn er jedoch behalten wurde, blieb die Möglichkeit bestehen, neue Signaturen mit dem alten Schlüssel zu erzeugen, obwohl er bereits durch einen neuen ersetzt worden war. Mit „valid-before“ und „valid-after“ können die Gültigkeitsbereiche der Schlüssel basierend auf dem Zeitpunkt der Signatur getrennt werden.
- In den Einstellungen für merge.conflictStyle, die es ermöglicht, den Modus für die Anzeige von Konflikten beim Merging auszuwählen, wurde der Modus „zdiff3“ hinzugefügt. Dieser verschiebt alle typischen Zeilen, die am Anfang oder Ende des Konflikts angegeben sind, außerhalb des Konfliktbereichs. Dadurch wird eine kompaktere Darstellung der Informationen erreicht.
- Der Befehl „git stash“ hat den Modus „—staged“ erhalten, der es ermöglicht, nur die Änderungen zu verbergen, die zum Index hinzugefügt wurden. Dies ist hilfreich in Situationen, in denen man vorübergehend einen Teil komplexer Änderungen zurückstellen möchte, um zuerst das Bereitgestellte hinzuzufügen und sich später um den Rest zu kümmern. Der Modus ähnelt dem Befehl „git commit“, der nur die zum Index hinzugefügten Änderungen aufzeichnet, jedoch wird beim Befehl „git stash —staged“ kein neuer Commit erstellt, sondern das Ergebnis wird in den temporären Bereich stash gespeichert. Wenn die Änderungen benötigt werden, können sie mit dem Befehl „git stash pop“ wiederhergestellt werden.
- Das Kommando „git log“ hat einen neuen Format-Spezifizierer „—format=%(describe)“ erhalten, der die Ausgabe von „git log“ mit dem Ergebnis des Befehls „git describe“ kombinieren kann. Die Parameter für „git describe“ werden direkt im Spezifizierer angegeben („—format=%(describe:match=,exclude=)“), in dem auch verkürzte Tags einbezogen werden können („—format=%(describe:tags=)“) und die Anzahl der hexadezimalen Zeichen zur Identifizierung von Objekten angepasst werden kann („—format=%(describe:abbrev=)“). Zum Beispiel kann für die Ausgabe der letzten 8 Commits, deren Tags keine Release-Kandidaten-Markierungen haben, und um 8-stellige Identifikatoren anzugeben, der Befehl verwendet werden: $ git log -8 —format='%(describe:exclude=*-rc*,abbrev=13)' v2.34.1-646-gaf4e5f569bc89 v2.34.1-644-g0330edb239c24 v2.33.1-641-g15f002812f858 v2.34.1-643-g2b95d94b056ab v2.34.1-642-gb56bd95bbc8f7 v2.34.1-203-gffb9f2980902d v2.34.1-640-gdf3c41adeb212 v2.34.1-639-g36b65715a4132
- In der Einstellung user.signingKey wurde die Unterstützung für neue Schlüsseltypen implementiert, die nicht nur auf den Typ „ssh-” und den vollständigen Dateipfad zum Schlüssel beschränkt sind. Alternative Typen werden mithilfe des Präfixes „key::“ definiert, zum Beispiel „key::ecdsa-sha2-nistp256“ für ECDSA-Schlüssel.
- Die Geschwindigkeit zur Generierung der Änderungslisten im «—histogram»-Modus sowie bei Verwendung der Option «—color-moved-ws», die die Farbgebung von Leerzeichen im diff steuert, wurde deutlich erhöht.
- Im Befehl «git jump», der verwendet wird, um Vim Informationen über genaue Übergänge an die angegebene Position in der Datei bei der Bearbeitung von Merge-Konflikten, beim Vergleich von Unterschieden oder bei Suchvorgängen bereitzustellen, wurde die Möglichkeit eingeführt, die betroffenen Merge-Konflikte einzugrenzen. Zum Beispiel kann zur Eingrenzung der Operationen auf das Verzeichnis «foo» «git jump merge — foo» angegeben werden, während für den Ausschluss des Verzeichnisses «Documentation» «git jump merge — ‘:^Documentation'» verwendet werden kann.
- Es wurde daran gearbeitet, die Verwendung des Typs «size_t» anstelle von «unsigned long» für Werte, die die Größe von Objekten darstellen, zu standardisieren. Dadurch wird die Anwendung der Filter «clean» und «smudge» auf Dateien mit einer Größe von mehr als 4 GB auf allen Plattformen, einschließlich solcher mit dem LLP64-Datenmodell, ermöglicht, bei dem der Typ «unsigned long» auf 4 Bytes begrenzt ist.
- Dem Befehl „git am“ wurde die Option „—empty=(stop|drop|keep)“ hinzugefügt, die bei der Verarbeitung von Patches aus dem Posteingang das Verhalten für leere E-Mails ohne Patches festlegt. Der Wert „stop“ führt zum Abbruch der gesamten Patch-Anwendung, „drop“ überspringt den leeren Patch, „keep“ erstellt einen leeren Commit.
- Die Befehle „git reset“, „git diff“, „git blame“, „git fetch“, „git pull“ und „git ls-files“ unterstützen nun partielle Indizes (sparse index), die die Leistung erhöhen und Speicherplatz in Repositories sparen, in denen partielle Klonvorgänge (sparse-checkout) durchgeführt werden.
- Der Befehl „git sparse-checkout init“ wurde als veraltet erklärt; stattdessen sollte „git sparse-checkout set“ verwendet werden.
- Eine erste Implementierung des neuen Backends „reftable“ wurde hinzugefügt, um Referenzen wie Branches und Tags im Repository zu speichern. Das neue Backend nutzt eine Blockspeicherlösung, die im Projekt JGit verwendet wird, und ist für die Speicherung einer sehr großen Anzahl von Referenzen optimiert. Das Backend ist derzeit noch nicht in das Referenzsystem (refs) integriert und nicht für den praktischen Einsatz bereit.
- Die Farbpalette des Befehls „git grep“ wurde an das GNU grep-Tool angepasst.
Quelle: opennet.ru
