Ich habe here geschaut aber konnte nicht ganz die Dinge herausfinden, über die ich mich wunderte: Wie findet git push
oder git pull
herauszufinden, was Commit-Objekte auf der anderen Seite fehlen?Wie bestimmt Git, welche Objekte zwischen den Repositories gesendet werden müssen?
Lassen Sie uns sagen, dass wir ein Repository mit den folgenden Commits haben: (Buchstaben stehen in für SHA-1-IDs, d
ist refs/heads/master
)
a -> b -> c -> d
Die Fernbedienung im Gegensatz dazu hat diese:
a -> e -> f -> g
Laut dem Git-Dokument, die Fernbedienung würde uns sagen, dass refs/heads/master
ist g
, aber da wir nicht wissen, dass commit, das sagt uns eigentlich nichts. Wie ist das genug, um die fehlenden Daten herauszufinden?
In der anderen Richtung, heißt es im Dokument:
An diesem Punkt der Fetch-Pack Prozess betrachtet, welche Objekte es hat und reagiert mit den Objekten, die sie durch das Senden muss „wollen“ und dann die SHA-1, die es will. Es sendet alle Objekte, die es bereits hat mit "haben" und dann die SHA-1. Am Ende dieser Liste, schreibt sie „fertig“ den Upload-Pack-Prozess zu initiieren, um die Packfile der Daten zu beginnen Senden sie brauchen:
dies erklärt, wie die Fernbedienung würde bestimmen, welche Daten zu senden, aber wouldn Trifft diese Auswirkung die Leistung auf Repositories mit vielen Objekten? Was ist sonst eigentlich im Text gemeint?
Anscheinend ist der Weg der Datenübertragung sehr unterschiedlich in Abhängigkeit von der Richtung (Push vs Pull). Was und wie sind die Herausforderungen, die mit dieser Designauswahl verbunden sind, und wie soll ich ihre Beschreibungen im Dokument verstehen?
Ihre Antwort ist sehr gut, danke! Wenn es Ihnen nichts ausmacht, interessiert mich besonders, wie Sie die vielen Rundreisen vermeiden können. Ist es einfach eine Angelegenheit, eifrig z.B.bis zu 50 Hashes (<1kb), oder gibt es einen eher theoretischen, algorithmischen Mechanismus, der schneller feststellen kann, ob ein Commit bekannt ist? –
Auch, wenn Sie irgendwelche Quellen für Ihre Antwort haben, wären diese großartig. Mein Anliegen war mehr "die Implementierung eines Git-ähnlichen Synchronisationsmechanismus", also bin ich voll zufrieden, aber ein zukünftiger Leser, der nach "wie GIT-Synchronisierung ist im Detail implementiert" sucht, könnte es zu schätzen wissen. –
@SillyFreak Ich fügte ein paar Referenzen zu weiteren Details hinzu. Das Konversationsbeispiel ist, wie ich es konzeptionell lehre, was Pro Git ["The Dumb Protocol"] nennt (http://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols#The-Dumb- Protokoll). Sie möchten ["The Smart Protocol"] (http://git-scm.com/book/de/v2/Git-Internals-Transfer-Protocols#The-Smart-Protocol) für ein effizienteres Beispiel betrachten. – Schwern