Nach drei Monaten Entwicklung wurde die Version 2.36 des verteilten Versionskontrollsystems Git veröffentlicht. Git ist eines der beliebtesten, zuverlĂ€ssigsten und leistungsfĂ€higsten Versionskontrollsysteme, das flexible Mittel fĂŒr nichtlineare Entwicklungen bietet, die auf Branching und Merging basieren. Um die IntegritĂ€t der Historie und die WiderstandsfĂ€higkeit gegen rĂŒckwĂ€rts gerichtete Ănderungen zu gewĂ€hrleisten, wird eine implizite Hash-VerschlĂŒsselung der gesamten vorherigen Historie in jedem Commit verwendet. Zudem ist es möglich, digitale Signaturen von einzelnen Entwicklern fĂŒr Tags und Commits zu bestĂ€tigen.
Im Vergleich zur vorherigen Version wurden in dieser neuen Version 717 Ănderungen aufgenommen, die mit der Mitarbeit von 96 Entwicklern vorbereitet wurden, von denen 26 erstmals an der Entwicklung teilnahmen. Die wichtigsten Neuerungen:
- Die Befehle âgit logâ und âgit showâ wurden um die Option ââremerge-diffâ erweitert. Diese ermöglicht es, die Unterschiede zwischen dem allgemeinen Merge-Ergebnis und den tatsĂ€chlichen Daten, die in dem Commit nach der AusfĂŒhrung des âmergeâ-Befehls reflektiert werden, anzuzeigen. Dadurch können die Ănderungen, die aufgrund der Konfliktlösung beim Merge durchgefĂŒhrt wurden, anschaulich bewertet werden. Der normale Befehl âgit showâ trennt die verschiedenen Konfliktlösungen durch EinrĂŒckungen, was das VerstĂ€ndnis der Ănderungen erschwert. Im folgenden Screenshot zeigt die Zeile â+/-â ohne EinrĂŒckung die letzte Konfliktlösung, die mit der Umbenennung des ersten Branches von sha1 in oid im Kommentar verbunden ist, wĂ€hrend â+/-â mit EinrĂŒckung die ursprĂŒngliche Konfliktlösung darstellt, die durch das Auftreten eines zusĂ€tzlichen Arguments in der Funktion dwim_ref() im zweiten Branch verursacht wurde.

Bei Verwendung der Option ââremerge-diffâ werden die Unterschiede zwischen den Konfliktlösungen nicht fĂŒr jeden Eltern-Branch getrennt angezeigt. Stattdessen werden die allgemeinen Unterschiede zwischen der Datei mit den Merge-Konflikten und der Datei, in der die Konflikte gelöst wurden, angezeigt.

- Die FlexibilitĂ€t bei der Konfiguration des Verhaltens beim ZurĂŒcksetzen von Festplattencaches durch den Aufruf der Funktion fsync() wurde erhöht. Der zuvor verfĂŒgbare Parameter core.fsyncObjectFiles wurde in zwei Konfigurationsvariablen, core.fsync und core.fsyncMethod, unterteilt, die es ermöglichen, fsync nicht nur auf Objektdateien (.git/objects), sondern auch auf andere Git-Strukturen wie Referenzen (.git/refs), Reflog und Packdateien anzuwenden.
Ăber die Variable core.fsync kann eine Liste interner Git-Strukturen angegeben werden, fĂŒr die nach einem Schreibvorgang zusĂ€tzlich fsync aufgerufen wird. Die Variable core.fsyncMethod ermöglicht die Auswahl der Methode zum ZurĂŒcksetzen des Caches; beispielsweise kann fsync fĂŒr den entsprechenden Systemaufruf ausgewĂ€hlt oder writeout-only zur Verwendung von verzögertem Schreiben (pagecache writeback) angegeben werden.
- Um sich vor der Manipulation von .git-Verzeichnissen durch andere Benutzer in gemeinsam genutzten Bereichen zu schĂŒtzen, wurde die ĂberprĂŒfung des Repository-Besitzers verstĂ€rkt. Das AusfĂŒhren von Git-Befehlen ist nun nur noch in den eigenen .git-Verzeichnissen erlaubt. Wenn das Repository-Verzeichnis einem anderen Benutzer gehört, wird standardmĂ€Ăig ein Fehler ausgegeben. Dieses Verhalten kann durch die Einstellung safe.directory deaktiviert werden.
- Der Befehl âgit cat-fileâ, der zur Ausgabe des Quellinhalts von Git-Objekten dient, hat eine Option ââbatch-commandâ erhalten, die die zuvor verfĂŒgbaren Befehle ââbatchâ und ââbatch-checkâ ergĂ€nzt und die adaptive Auswahl des Ausgabeformats durch Angabe von âcontents â zum Ausgeben des Inhalts oder âinfo â zum Ausgeben von Informationen ĂŒber das Objekt ermöglicht. Zudem wird der Befehl âflushâ unterstĂŒtzt, um den Ausgabepuffer zurĂŒckzusetzen.
- Der Befehl âgit ls-treeâ wurde um die Option ââoid-onlyâ (ââobject-onlyâ) erweitert, Ă€hnlich wie ââname-onlyâ, um nur die Objekt-IDs auszugeben und dadurch die Verwendung in Skripten zu vereinfachen. AuĂerdem wurde die Option ââformatâ implementiert, die es ermöglicht, ein benutzerdefiniertes Ausgabeformat zu definieren, das Informationen ĂŒber Modus, Typ, Name und GröĂe kombiniert.
- Im Befehl âgit bisect runâ wurde die Erkennung des Fehlens des AusfĂŒhrungsattributs fĂŒr Skripte implementiert, sodass in diesem Fall Fehler mit den Codes 126 oder 127 ausgegeben werden (zuvor wurden alle Revisionen, die nicht ausgefĂŒhrt werden konnten, als problematisch markiert).
- Der Befehl âgit fetchâ wurde um die Option âârefetchâ ergĂ€nzt, um alle Objekte abzurufen, ohne die andere Seite ĂŒber den bereits auf dem lokalen System vorhandenen Inhalt zu informieren. Ein solches Verhalten kann nĂŒtzlich sein, um den Zustand nach Fehlern wiederherzustellen, wenn die IntegritĂ€t der lokalen Daten ungewiss ist.
- Die Befehle âgit update-indexâ, âgit checkout-indexâ, âgit read-treeâ und âgit cleanâ unterstĂŒtzen jetzt partielle Indizes (sparse index), die die Leistung verbessern und Speicherplatz in Repositories sparen, bei denen spĂ€rliches Klonen (sparse-checkout) durchgefĂŒhrt wird.
- Das Verhalten des Befehls âgit clone âfilter=⊠ârecurse-submodulesâ wurde geĂ€ndert, sodass nun nur die Submodule teilweise geklont werden (frĂŒher wurde der Filter nur auf den Hauptinhalt angewendet, wĂ€hrend die Submodule vollstĂ€ndig ohne BerĂŒcksichtigung des Filters geklont wurden).
- Im Befehl âgit bundleâ wurde die UnterstĂŒtzung fĂŒr die Angabe von Filtern fĂŒr die selektive Aufnahme von Inhalten hinzugefĂŒgt, Ă€hnlich wie bei den Operationen des partiellen Klonens.
- Dem Befehl âgit branchâ wurde die Option âârecurse-submodulesâ hinzugefĂŒgt, um Submodule rekursiv zu durchlaufen.
- FĂŒr die Sprache Kotlin wurde ein neuer Userdiff-Handler vorgeschlagen.
Quelle: opennet.ru


