Ab Git Version 2.5+ (Q2 2015) ist das Abrufen eines einzelnen Commits (ohne das vollständige Repo zu klonen) tatsächlich möglich.
Siehe Commit 68ee628 von Fredrik Medley ( moroten
) , 21. Mai 2015.
(Zusammengeführt von Junio C Hamano - gitster
- in Commit a9d3493 , 01. Juni 2015)
Sie haben jetzt eine neue Konfiguration (auf der Serverseite)
uploadpack.allowReachableSHA1InWant
Erlauben Sie upload-pack
, eine Abrufanforderung zu akzeptieren, die nach einem Objekt fragt, das von jedem Referenztipp aus erreichbar ist. Beachten Sie jedoch, dass die Berechnung der Erreichbarkeit von Objekten rechenintensiv ist.
Der Standardwert ist false
.
Wenn Sie diese serverseitige Konfiguration mit einem flachen Klon ( git fetch --depth=1
) kombinieren, können Sie ein einzelnes Commit anfordern (siehe t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Mit dem git cat-file
Befehl können Sie feststellen , dass das Commit abgerufen wurde:
git cat-file commit $SHA1
" git upload-pack
" das dient " git fetch
" kann angewiesen werden, Commits zu bedienen, die sich nicht an der Spitze eines Refs befinden, solange sie von einem Ref aus mit einer uploadpack.allowReachableSHA1InWant
Konfigurationsvariablen erreichbar sind.
Die vollständige Dokumentation lautet:
upload-pack
: Ermöglicht optional das Abrufen von erreichbarem sha1
Wenn die uploadpack.allowReachableSHA1InWant
Konfigurationsoption auf der Serverseite festgelegt ist, kann " git fetch
" eine Anforderung mit einer "Such" -Zeile stellen, die ein Objekt benennt, das nicht angekündigt wurde (wahrscheinlich außerhalb des Bandes oder von einem Submodulzeiger abgerufen wurde).
Es werden nur Objekte verarbeitet, die über die Zweigspitzen erreichbar sind, dh die Vereinigung der beworbenen Zweige und der von ausgeblendeten Zweige transfer.hideRefs
.
Beachten Sie, dass das Zurückgehen des Verlaufs zur Überprüfung der Erreichbarkeit mit Kosten verbunden ist.
Diese Funktion kann verwendet werden, wenn der Inhalt eines bestimmten Commits abgerufen wird, für den sha1 bekannt ist, ohne dass das gesamte Repository geklont werden muss, insbesondere wenn ein flacher Abruf verwendet wird .
Nützliche Fälle sind z
- Repositorys mit großen Dateien im Verlauf,
- nur die benötigten Daten für eine Submodul-Prüfung abrufen,
- Wenn Sie einen sha1 teilen, ohne zu sagen, zu welchem Zweig er gehört, und in Gerrit, wenn Sie in Commits denken, anstatt Zahlen zu ändern.
(Der Gerrit-Fall wurde bereits gelöst, allowTipSHA1InWant
da jede Gerrit-Änderung eine Referenz hat.)
Git 2.6 (Q3 2015) wird dieses Modell verbessern.
Siehe Commit 2bc31d1 , Commit cc118a6 (28. Juli 2015) von Jeff King ( peff
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 824a0be , 19. August 2015)
refs
: negativ unterstützen transfer.hideRefs
Wenn Sie eine Hierarchie von Refs mithilfe der transfer.hideRefs
Konfiguration ausblenden, können Sie diese Konfiguration später nicht überschreiben, um sie "einzublenden".
Dieser Patch implementiert ein "negatives" Verstecken, wodurch Übereinstimmungen sofort als nicht ausgeblendet markiert werden, selbst wenn eine andere Übereinstimmung sie ausblenden würde.
Wir achten darauf, die Übereinstimmungen in umgekehrter Reihenfolge anzuwenden, wie sie uns von der Konfigurationsmaschinerie zugeführt werden, da dadurch unsere übliche Konfigurationsrangfolge "Letzter gewinnt" funktioniert (und Einträge in .git/config
beispielsweise überschreiben /etc/gitconfig
).
So können Sie jetzt tun:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
refs/secret
in allen Repos zu verstecken , außer einem öffentlichen Bit in einem bestimmten Repo.
Git 2.7 (Nov / Dec 2015) wird sich wieder verbessern:
Siehe Commit 948bfa2 , Commit 00b293e (05. November 2015), Commit 78a766a , Commit 92cab49 , Commit 92cab49 , Commit 92cab49 (03. November 2015), Commit 00b293e , Commit 00b293e (05. November 2015) und Commit 92cab49 , Commit 92cab49 , Commit 92cab49 , Commit 92cab49 (03. November 2015) von Lukas Fleischer ( lfos
) .
Mit freundlicher Unterstützung von Eric Sunshine ( sunshineco
) .
(Zusammengeführt von Jeff King - peff
- in Commit dbba85e , 20. November 2015)
config.txt
: Dokumentieren Sie die Semantik von hideRefs
mit Namespaces
Derzeit gibt es keine klare Definition, wie transfer.hideRefs
sich ein Namespace verhalten soll.
Erklären Sie, dass hideRefs
Präfixe in diesem Fall mit entfernten Namen übereinstimmen. So werden hideRefs
Muster derzeit im Empfangspaket behandelt.
hideRefs: Unterstützung für übereinstimmende vollständige Refs hinzufügen
Zusätzlich zum Abgleichen von gestrippten Refs können jetzt hideRefs
Muster hinzugefügt werden, mit denen der vollständige (nicht gestrippte) Ref abgeglichen wird.
Um zwischen gestrippten und vollständigen Übereinstimmungen zu unterscheiden, muss diesen neuen Mustern ein Zirkumflex ( ^
) vorangestellt werden .
Daher die neue Dokumentation :
transfer.hideRefs:
Wenn ein Namespace verwendet wird, wird das Namespace-Präfix von jeder Referenz entfernt, bevor es mit transfer.hiderefs
Mustern abgeglichen wird .
Wenn beispielsweise refs/heads/master
angegeben in transfer.hideRefs
und der aktuellen Namensraum ist foo
, dann refs/namespaces/foo/refs/heads/master
wird aus der Werbung verzichtet aber refs/heads/master
und
refs/namespaces/bar/refs/heads/master
werden immer noch als so genannte „haben“ Linien ausgeschrieben.
Um die Refs vor dem Strippen abzugleichen, fügen Sie ^
vor dem Ref-Namen ein hinzu. Wenn Sie !
und kombinieren ^
, !
muss zuerst angegeben werden.
R .. erwähnt in den Kommentaren die Konfiguration uploadpack.allowAnySHA1InWant
, die es ermöglicht upload-pack
, eine fetch
Anfrage zu akzeptieren , die überhaupt nach einem Objekt fragt. (Standardmäßig false
).
Siehe Commit f8edeaa (Nov. 2016, Git v2.11.1) von David "novalis" Turner ( novalis
) :
upload-pack
: Ermöglicht optional das Abrufen von sha1
Es erscheint ein wenig albern, eine Erreichbarkeitsprüfung durchzuführen, wenn wir dem Benutzer vertrauen, dass er auf absolut alles im Repository zugreift.
Außerdem ist es in einem verteilten System rassig - vielleicht kündigt ein Server eine Referenz an, aber ein anderer hat seitdem einen Force-Push für diese Referenz erhalten, und möglicherweise werden die beiden HTTP-Anforderungen an diese verschiedenen Server weitergeleitet.