Ich arbeite mit einem Repository mit einer sehr großen Anzahl von Dateien, deren Auschecken Stunden dauert. Ich prüfe die Möglichkeit, ob Git jetzt mit dieser Art von Repository gut funktioniert, da es spärliche Checkouts unterstützt, aber jedes Beispiel, das ich finden kann, führt Folgendes aus:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Das Problem bei dieser Befehlsfolge ist, dass der ursprüngliche Klon auch eine Prüfung durchführt. Wenn Sie dem ursprünglichen Klonbefehl -n hinzufügen, führt der Befehl read-tree zu folgendem Fehler:
Fehler: Beim spärlichen Auschecken bleibt kein Eintrag im Arbeitsverzeichnis
Wie kann das spärliche Auschecken durchgeführt werden, ohne zuerst alle Dateien auszuchecken?
git worktree add --no-checkout
auch (nicht nurgit clone --no-checkout
) mit Git 2.9 (nur 2016). Siehe meine Antwort untenAntworten:
Im Jahr 2020 gibt es eine einfachere Möglichkeit, mit Sparse-Checkout umzugehen, ohne sich um .git-Dateien kümmern zu müssen. So habe ich es gemacht:
Beachten Sie, dass Git Version 2.25 installiert sein muss. Lesen Sie hier mehr darüber: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
AKTUALISIEREN:
Der obige
git clone
Befehl klont das Repo weiterhin mit seinem vollständigen Verlauf, ohne jedoch die Dateien auszuchecken. Wenn Sie nicht den vollständigen Verlauf benötigen, können Sie dem Befehl den Parameter --depth wie folgt hinzufügen :quelle
sparse-checkout --cone
Funktion in stackoverflow.com/a/59515426/6309--filter
, Ihrer Antwort hier einen Teilklon ( ) hinzuzufügen .--depth
Parameters aktualisiert, mit dem wir einen flachen Klon erstellen können . Wird das helfen? @Tao, nicht sicher, wie man--filter
in diesem Fall verwendet, ich habe es nicht versucht. Könnten Sie ein Beispiel geben oder eine andere Antwort auf dieses Thema posten?Bitte beachten Sie, dass diese Antwort eine vollständige Kopie der Daten aus einem Repository herunterlädt. Das
git remote add -f
Befehl klont das gesamte Repository. Aus der Manpage vongit-remote
:Versuche dies:
Jetzt werden Sie feststellen, dass Sie eine "beschnittene" Kasse haben, bei der nur Dateien vom Pfad / inside_repo / zum / gewünschten_subdir (und in diesem Pfad) vorhanden sind.
Beachten Sie, dass Sie in der Windows-Befehlszeile den Pfad nicht angeben dürfen, dh Sie müssen den 6. Befehl mit diesem ändern:
Wenn Sie dies nicht tun, erhalten Sie die Anführungszeichen in der Sparse-Checkout-Datei, und es wird nicht funktionieren
quelle
git remote add
Befehl lädt alles herunter, weil er-f
genau das tut - er fordert ihn auf, sofort abzurufen, bevor Sie die Optionen für das spärliche Auschecken definiert haben. Aber das Weglassen oder Neuanordnen hilft nicht weiter. Sparse Checkouts wirken sich nur auf den Arbeitsbaum aus, nicht auf das Repository. Wenn Sie möchten, dass Ihr Repository stattdessen eine Diät macht, müssen Sie stattdessen die Optionen--depth
oder--single-branch
prüfen.Git-Klon hat eine Option (
--no-checkout
oder-n
), die macht, was Sie wollen.Ändern Sie in Ihrer Befehlsliste einfach:
Dazu:
Sie können dann die spärliche Kaufabwicklung wie in der Frage angegeben verwenden.
quelle
--depth <depth>
Option für den Git-Klon. Dadurch werden nur die letzten<depth>
Commits aus dem Verlauf heruntergeladen . Derzeit gibt es keine Möglichkeit, ein einzelnes Commit mit git teilweise herunterzuladen. Wenn Ihre Fernbedienung dies jedoch unterstützt, können Siegit archive --remote
teilweise Dateigruppen herunterladen.Ich hatte einen ähnlichen Anwendungsfall, außer dass ich nur das Commit für ein Tag auschecken und die Verzeichnisse bereinigen wollte. Die Verwendung
--depth 1
macht es sehr spärlich und kann die Dinge wirklich beschleunigen.quelle
Ich habe die gesuchte Antwort von dem Einzeiler gefunden, den pavek zuvor gepostet hat (danke!), Daher wollte ich eine vollständige Antwort in einer einzigen Antwort geben, die unter Linux (GIT 1.7.1) funktioniert :
Ich habe die Reihenfolge der Befehle ein wenig geändert, aber das scheint keine Auswirkungen zu haben. Der Schlüssel ist das Vorhandensein des abschließenden Schrägstrichs "/" am Ende des Pfades in Schritt 5.
quelle
Leider hat keines der oben genannten Verfahren für mich funktioniert, so dass ich sehr lange Zeit damit verbracht habe, verschiedene Dateikombinationen
sparse-checkout
auszuprobieren.In meinem Fall wollte ich Ordner mit IntelliJ IDEA-Konfigurationen überspringen.
Folgendes habe ich getan:
Lauf
git clone https://github.com/myaccount/myrepo.git --no-checkout
Lauf
git config core.sparsecheckout true
Erstellt
.git\info\sparse-checkout
mit folgenden InhaltenFühren Sie 'git checkout -' aus, um alle Dateien abzurufen.
Entscheidend dafür war, dass
/*
der Name des Ordners hinzugefügt wurde .Ich habe Git 1.9
quelle
Ja, es ist möglich, einen Ordner herunterzuladen, anstatt das gesamte Repository herunterzuladen. Sogar irgendein / letztes Commit
Gute Möglichkeit, dies zu tun
-r HEAD lädt nur die letzte Revision herunter, ignoriert den gesamten Verlauf.
Beachten Sie den Trunk und / bestimmten Ordner
Kopieren und ändern Sie die URL vorher und nachher
/trunk/
. Ich hoffe das hilft jemandem. Genießen :)Aktualisiert am 26. September 2019
quelle
git 2.9 (Juni 2016) verallgemeinert die
--no-checkout
Option aufgit worktree add
(den Befehl, der es ermöglicht, mit mehreren Arbeitsbäumen für ein Repo zu arbeiten )Siehe Commit ef2a0ac (29. März 2016) von Ray Zhang (
OneRaynyDay
) .Unterstützt von: Eric Sunshine (
sunshineco
) und Junio C Hamano (gitster
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 0d8683c , 13. April 2016)Die
git worktree
Manpage enthält jetzt:quelle
Schritte zum spärlichen Auschecken nur bestimmter Ordner:
quelle
Basierend auf dieser Antwort von apenwarr und diesem Kommentar von Miral habe ich die folgende Lösung gefunden, mit der ich beim lokalen Klonen des Linux-Git-Repositorys fast 94% des Speicherplatzes gespart habe, während nur ein Dokumentations-Unterverzeichnis benötigt wurde:
Also bin ich von 2,9 GB auf 182 MB runtergekommen, was schon ganz nett ist.
Ich habe dies jedoch nicht zum Laufen gebracht
git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( hier angedeutet ), da dann alle fehlenden Dateien als entfernte Dateien zum Index hinzugefügt wurden. Wenn also jemand das Äquivalent vongit clone --filter=blob:none
for kenntgit fetch
, können wir wahrscheinlich noch ein paar Megabyte sparen. (Das Lesen der Manpage vongit-rev-list
weist auch darauf hin, dass es so etwas gibt--filter=sparse:path=…
, aber ich habe das auch nicht zum Laufen gebracht.(Alle haben es mit Git 2.20.1 von Debian Buster versucht.)
quelle
--filter=sparse:path=…
.Ich bin neu in Git, aber es scheint, dass es funktioniert, wenn ich Git-Checkout für jedes Verzeichnis mache. Außerdem muss die Sparse-Checkout-Datei nach jedem Verzeichnis wie angegeben einen abschließenden Schrägstrich enthalten. Jemand mehr Erfahrung bitte bestätigen, dass dies funktionieren wird.
Interessanterweise scheint es keinen Unterschied zu machen, wenn Sie ein Verzeichnis auschecken, das sich nicht in der Sparse-Checkout-Datei befindet. Sie werden nicht im Git-Status angezeigt und der Git-Lesebaum -m -u HEAD bewirkt nicht, dass er entfernt wird. git reset --hard bewirkt auch nicht, dass das Verzeichnis entfernt wird. Hat jemand mehr Erfahrung damit, zu kommentieren, was Git von Verzeichnissen hält, die ausgecheckt sind, aber nicht in der spärlichen Checkout-Datei enthalten sind?
quelle
In meinem Fall möchte ich den
Pods
Ordner beim Klonen des Projekts überspringen . Ich habe Schritt für Schritt wie unten und es funktioniert für mich. Ich hoffe es hilft.Anmerkung: Wenn Sie mehr Ordner überspringen möchten, fügen Sie einfach mehr Zeilen in die Sparse-Checkout-Datei ein.
quelle