Gibt es eine Möglichkeit, nur ein bestimmtes Commit von einem Remote-Git-Repo abzurufen, ohne es auf meinem PC zu klonen? Die Struktur von Remote Repo ist absolut dieselbe wie die von mir und daher gibt es keine Konflikte, aber ich habe keine Ahnung, wie das geht, und ich möchte dieses riesige Repository nicht klonen.
Ich bin neu in Git, gibt es einen Weg?
Antworten:
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)
Wenn Sie diese serverseitige Konfiguration mit einem flachen Klon (
git fetch --depth=1
) kombinieren, können Sie ein einzelnes Commit anfordern (siehet/t5516-fetch-push.sh
:Mit dem
git cat-file
Befehl können Sie feststellen , dass das Commit abgerufen wurde:Die vollständige Dokumentation lautet:
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)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)Daher die neue Dokumentation :
R .. erwähnt in den Kommentaren die Konfiguration
uploadpack.allowAnySHA1InWant
, die es ermöglichtupload-pack
, einefetch
Anfrage zu akzeptieren , die überhaupt nach einem Objekt fragt. (Standardmäßigfalse
).Siehe Commit f8edeaa (Nov. 2016, Git v2.11.1) von David "novalis" Turner (
novalis
) :quelle
uploadpack.allowAnySHA1InWant
ohne die Erreichbarkeitsberechnungsstrafe (und den DoS-Vektor).Sie klonen nur einmal. Wenn Sie also bereits einen Klon des Remote-Repositorys haben, wird durch Abrufen nicht alles erneut heruntergeladen. Geben Sie einfach an, welchen Zweig Sie abrufen möchten, oder rufen Sie die Änderungen ab und überprüfen Sie das gewünschte Commit.
Das Abrufen aus einem neuen Repository ist sehr kostengünstig, da nur die Änderungen heruntergeladen werden, die Sie nicht haben. Denken Sie daran, dass Git mit minimaler Belastung das Richtige macht.
Git speichert alles im
.git
Ordner. Ein Commit kann nicht isoliert abgerufen und gespeichert werden, es benötigt alle seine Vorfahren. Sie sind miteinander verbunden .Um die Downloadgröße zu verringern, können Sie git jedoch bitten, nur Objekte abzurufen, die sich auf einen bestimmten Zweig oder ein bestimmtes Commit beziehen:
Dadurch werden nur Commits heruntergeladen, die in der Remote-Verzweigung enthalten sind
branch
(und nur die, die Sie verpassen) , und in gespeichertorigin/branch
. Sie können dann zusammenführen oder auschecken.Sie können auch nur ein SHA1-Commit angeben:
Dadurch wird nur das Commit des angegebenen SHA-1 96de5297df870 (und seiner Vorfahren, die Sie vermissen) heruntergeladen und als (nicht vorhandener) Remote-Zweig gespeichert
origin/foo-commit
.quelle
2.7.4-0ubuntu1.3
. Bei Verwendung2.16.2-0ppa1~ubuntu16.04.1
von Git-Core-PPA funktioniert dies jedoch ordnungsgemäß. Klingt nach einem Fehler, der behoben wurde. Bei einer Schnellsuche konnte kein Hinweis darauf gefunden werden. Wenn mir jemand einen Hinweis darauf geben kann, würde ich dieses Update gerne zurückportieren lassen.Ich habe an meinem Git Repo gezogen:
Erlaubte git, den gesamten Code für den Zweig einzuziehen, und dann machte ich einen Reset zu dem Commit, das mich interessierte.
git reset --hard <commit-hash>
Hoffe das hilft.
quelle
git reset --hard
in verallgemeinerten Lösungen verwendet werden, können Menschen in Fallen führen, in denen sie Daten verlieren (oder in diesem Fall in einem Zustand, in dem das Zurückholen ihrer Daten nicht trivial ist).Sie können einfach ein einzelnes Commit eines Remote-Repos mit abrufen
wo,
<repo>
kann ein Remote-Repo-Name (z. B.origin
) oder sogar eine Remote-Repo-URL (z. B.https://git.foo.com/myrepo.git
) sein<commit>
kann das SHA1-Commit seinbeispielsweise
Nachdem Sie das Commit (und die fehlenden Vorfahren) abgerufen haben, können Sie es einfach mit auschecken
Beachten Sie, dass Sie dadurch in den Zustand "Abgelöster Kopf" versetzt werden.
quelle
fetch
eine bestimmte Umdrehung versuche, wie Sie es dort tun, schlägt git mit Fehlercode 1 und ohne Ausgabe fehl. War dies etwas, das in früheren Versionen funktioniert hat? (Ich bin v2.0.2.)fetch
, obwohl ich in diesem Fall nicht sicher bin, was die Verwendung ist.git checkout FETCH_HEAD
hilft.--depth=1
)!Sie können das Remote-Repo einfach abrufen mit:
wo,
<repo>
kann ein Remote-Repo-Name (z. B.origin
) oder sogar eine Remote-Repo-URL (z. B.https://git.foo.com/myrepo.git
) seinbeispielsweise:
Nachdem Sie die Repos abgerufen haben, können Sie die gewünschten Commits zusammenführen (da es um das Abrufen eines Commits geht, können Sie stattdessen Cherry-Pick verwenden, um nur ein Commit auszuwählen):
<commit>
kann das SHA1-Commit seinbeispielsweise:
oder
Wenn es sich um das letzte Commit handelt, das Sie zusammenführen möchten, können Sie auch die Variable FETCH_HEAD verwenden:
quelle
git config set uploadpack.allowReachableSHA1InWant
?Das funktioniert am besten:
Nennen Sie "temp", was auch immer Sie wollen ... dieser Zweig könnte jedoch verwaist sein
quelle
Schließlich habe ich einen Weg gefunden, ein bestimmtes Commit mit zu klonen Git Cherry-Pick . Angenommen, Sie haben kein lokales Repository und ziehen ein bestimmtes Commit von der Remote-Adresse.
1) Erstellen Sie ein leeres Repository in lokalen und git init
2) git remote add origin " URL des Repositorys "
3) Git holen Ursprung [Dadurch werden Ihre Dateien nur dann in Ihren lokalen Arbeitsbereich verschoben, wenn Sie sie zusammenführen.]
4) git cherry-pick " Geben Sie den Long-Commit-Hash ein, den Sie brauchen "
Fertig. Auf diese Weise haben Sie nur die Dateien von diesem bestimmten Commit in Ihrem lokalen.
Enter-Long-Commit-Hash:
Sie können dies mit -> git log --pretty = oneline erhalten
quelle
Ich denke, 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) sollte tun, was Sie wollen. Ohne Kraft holen oder ziehen.
quelle
Wenn sich das angeforderte Commit in den Pull-Anforderungen des Remote-Repos befindet, können Sie es anhand seiner ID abrufen:
quelle