Ich habe eine Sammlung von Slackbuilds gefunden, einige, die ich brauche, gibt es auf GitHub. https://github.com/PhantomX/slackbuilds/ Ich möchte nicht alles Git bekommen.
git clone https://github.com/PhantomX/slackbuilds.git
Aber nur einen Slackbuild für diesen .
Wie geht das? Ist das möglich?
Kommentare
Antwort
Am Ende wird der gesamte Verlauf heruntergeladen, daher sehe ich keinen großen Nutzen darin, aber Sie kann bestimmte Teile mit einer „spärlichen“ Kasse auschecken. Zitieren von dieses Stapelüberlaufposts :
Die Schritte zum Ausführen eines spärlichen Der Klon lautet wie folgt:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Dadurch wird ein leeres Repository mit Ihrer Fernbedienung erstellt und alle Objekte abgerufen, aber nicht ausgecheckt do:
git config core.sparseCheckout true
Jetzt müssen Sie definieren, welche Dateien / Ordner Sie tatsächlich auschecken möchten. Dies erfolgt durch Auflisten in
.git/info/sparse-checkout
, z. B.:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
Last but not least, Aktualisieren Sie Ihr leeres Repo mit dem Status von der Fernbedienung:
git pull origin master
Vielleicht möchten Sie einen Blick auf die erweitertes Tutorial und Sie sollten wahrscheinlich die offizielle Dokumentation für spärliches Auschecken lesen.
Möglicherweise ist es besser, auch einen flachen Klon zu verwenden. Anstelle des git pull
Befehl, der zuvor gegeben wurde, versuchen Sie:
git pull --depth=1 origin master
Kommentare
- Ich erhalte
error: Sparse checkout leaves no entry on working directory
, nachdem ich einen Git-Pull ausgeführt habe, nachdem ich die Änderung ancore.sparseCheckout
und.git/info/sparse-checkout
- Korrektur:
git init; git remote ...
nur Dinge einrichten, nichts wird heruntergeladen. Der springende Punkt bei Sparse ist, nur Objekte zu erhalten, an denen Sie interessiert sind. - @vonbrand, dass ‚ das ist, was die
-f
gilt für: “ Mit der Option -f wird git fetch < name > wird unmittelbar nach dem Einrichten der Remote-Informationen ausgeführt. “ - Nach
git remote add -f origin <url>
lädt git immer noch das gesamte Repo herunter . In meinem Fall möchte ich ‚ keine Zeit damit verbringen, darauf zu warten, auch wenn ‚ nicht das gesamte Repo auscheckt. - Beim Auschecken mit geringer Dichte definieren wir, was ausgecheckt werden soll. Gibt es jedoch eine Möglichkeit, einige Verzeichnisse auszuschließen und den Rest auszuchecken?
Antwort
git clone --filter
aus Git 2.19 funktioniert jetzt auf GitHub (getestet 2020-09) -18, git 2.25.1)
Diese Option wurde zusammen mit einem Update des Remote-Protokolls hinzugefügt und verhindert wirklich, dass Objekte von der heruntergeladen werden Server.
Zum Beispiel, um nur Objekte zu klonen, die für d1
dieses Repositorys erforderlich sind: https://github.com/cirosantilli/test-git-partial-clone Ich kann Folgendes tun:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
Der Klonbefehl erhält nur:
- ein einzelnes Festschreibungsobjekt mit der Spitze des Zweigs
master
- alle 4 Baumobjekte des Repositorys:
- Verzeichnis der Festschreibung auf oberster Ebene
- die drei Verzeichnisse
d1
,d2
,master
Dann ruft der Befehl checkout
nur die fehlenden Blobs (Dateien) vom Server ab:
-
d1/a
-
d1/b
Noch besser, später wird GitHub wahrscheinlich anfangen zu unterstützen:
--filter=blob:none \ --filter=tree:0 \
wobei --filter=tree:0
von Git 2.20 das verhindert unnötiges clone
Abrufen aller Baumobjekte und Verschieben auf checkout
. Bei meinem Test 2020-09-18 schlägt dies jedoch fehl mit:
fatal: invalid filter-spec "combine:blob:none+tree:0"
vermutlich, weil der --filter=combine:
zusammengesetzte Filter ( hinzugefügt in Git 2.24, impliziert durch mehrere --filter
) ist noch nicht implementiert.
Ich habe beobachtet, mit welchen Objekten abgerufen wurde:
git verify-pack -v .git/objects/pack/*.pack
wie unter erwähnt https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Es gibt mir keinen sehr klaren Hinweis darauf, was jedes Objekt genau ist, aber es gibt den Typ jedes Objekts an (commit
, tree
, blob
), und da dieses minimale Repo so wenige Objekte enthält, kann ich eindeutig ableiten, was jedes ist Objekt ist.
git rev-list --objects --all
hat zwar eine klarere Ausgabe mit Pfaden für Baum / Blobs erzeugt, aber leider werden beim Ausführen einige Objekte abgerufen, was die Bestimmung erschwert Was wurde wann abgerufen? Lassen Sie mich wissen, ob jemand einen besseren Befehl hat.
TODO finden Sie die GitHub-Ankündigung, die besagt, wann sie damit begonnen haben, ihn zu unterstützen. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ vom 17.01.2020 erwähnt bereits --filter blob:none
.
git sparse-checkout
I. Ich denke, dieser Befehl soll eine Einstellungsdatei verwalten, in der “ steht. Diese Teilbäume “ interessieren mich nur, sodass zukünftige Befehle nur diese betreffen Teilbäume. Es ist jedoch etwas schwierig, sich sicher zu sein, da die aktuelle Dokumentation etwas … spärlich ist 😉
Sie verhindert nicht das Abrufen von Blobs.
Wenn dieses Verständnis korrekt ist, ist dies eine gute Ergänzung zu git clone --filter
, wie oben beschrieben, da es das unbeabsichtigte Abrufen weiterer Objekte verhindern würde, wenn Sie beabsichtigen, Git-Operationen im teilweise geklonten Repo auszuführen .
Als ich Git 2.25.1 ausprobierte:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
funktionierte es nicht, weil die init
hat tatsächlich alle Objekte abgerufen.
In Git 2.28 wurden die Objekte jedoch nicht wie gewünscht abgerufen. Aber wenn ich das tue:
git sparse-checkout set d1
d1
wird nicht abgerufen und ausgecheckt, obwohl dies ausdrücklich angegeben ist sollte: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # Sparse-Checkout- und Partial-Clones Mit Haftungsausschluss:
Achten Sie darauf, dass die Teilklonfunktion allgemein verfügbar wird [1].
[1]: GitHub evaluiert diese Funktion noch intern, solange sie aktiviert ist auf einigen ausgewählten Repositorys (einschließlich des in diesem Beitrag verwendeten Beispiels). Wenn sich die Funktion stabilisiert und ausgereift ist, werden wir Sie über den Fortschritt auf dem Laufenden halten.
Also ja, es ist einfach zu schwer, sich sicher zu sein Moment, zum Teil dank der Freude, dass GitHub eine geschlossene Quelle ist. Aber lassen Sie uns ein Auge darauf haben.
Befehlsaufschlüsselung
Der Server sollte konfiguriert sein mit:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Befehlsaufschlüsselung:
-
--filter=blob:none
überspringt alle Blobs, ruft jedoch weiterhin alle Baumobjekte -
--filter=tree:0
überspringt die nicht benötigten Bäume: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
impliziert bereits--single-branch
, siehe auch: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
ist erforderlich, umgit clone
Protokoll-Spielereien zu überwinden: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
ist die Syntax, bei der mehrere Filter verwendet werden Der Versuch,--filter
zu übergeben, schlägt aus irgendeinem Grund einmal fehl mit: “ Mehrere Filterspezifikationen können nicht kombiniert werden „. Dies wurde in Git 2.24 unter e987df5fe62b8b29be4cdcdeb3704681ada2b29e hinzugefügt. “ Listenobjektfilter: Verbundfilter implementieren “Bearbeiten: Auf Git 2.28 sehe ich experimentell, dass
--filter=FILTER1 --filter FILTER2
den gleichen Effekt hat, da GitHubcombine:
ab 2020-09- noch nicht implementiert. 18 und beschwert sichfatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO in welcher Version eingeführt?
Das Format von --filter
ist in man git-rev-list
.
Dokumente im Git-Baum:
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
Testen Sie es lokal
Das folgende Skript generiert reproduzierbar die https://github.com/cirosantilli/test-git-partial-clone Repository lokal, führt einen lokalen Klon durch und beobachtet, was geklont wurde:
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Ausgabe in Git v2.19.0:
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
Schlussfolgerungen: Alle Blobs von außerhalb von d1/
fehlen. Z.B.0975df9b39e23c15f63db194df7f45c76528bccb
, dh d2/b
ist nach dem Auschecken von d1/a
nicht vorhanden.
Beachten Sie, dass root/root
und mybranch/mybranch
ebenfalls fehlen, aber --depth 1
verbirgt dies vor die Liste der fehlenden Dateien. Wenn Sie --depth 1
entfernen, werden sie in der Liste der fehlenden Dateien angezeigt.
Ich habe einen Traum
Diese Funktion könnte Git revolutionieren.
Stellen Sie sich vor, Sie hätten die gesamte Codebasis Ihres Unternehmens in einem einzelnen Repo ohne hässliche Tools von Drittanbietern wie repo
.
Stellen Sie sich vor, speichert riesige Blobs direkt im Repo ohne hässliche Erweiterungen von Drittanbietern .
Stellen Sie sich vor, GitHub würde pro Datei / Verzeichnis-Metadaten wie Sterne und Berechtigungen, sodass Sie alle Ihre persönlichen Daten unter einem einzigen Repo speichern können.
Stellen Sie sich vor, Submodule wurden genau wie reguläre Verzeichnisse behandelt : Fordern Sie einfach eine Baum-SHA an, und ein DNS-ähnlicher Mechanismus löst Ihre Anfrage . Schauen Sie sich zuerst Ihre lokale ~/.git
, dann zuerst zu näheren Servern (dem Spiegel / Cache Ihres Unternehmens) und landet auf GitHub.
Antwort
Versuchen Sie Folgendes:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Kommentare
- Dies ist der einfachste Weg. Es wird nicht das gesamte Repo heruntergeladen. Beachten Sie, dass wir die
/trunk
hinzufügen und/tree/master
entfernen müssen. Mehr hier - Danke! Ich möchte nur einen Ordner des Repos klonen und nicht alle Ordner in einem Repo. Und dieser funktioniert wirklich für mich.
Antwort
Arbeitslösung:
Sie Sie müssen die Komprimierung deaktivieren:
git config --global core.compression 0
Dann müssen Sie einen flachen Klon verwenden.
git clone --depth=1 <url>
dann ist der wichtigste Schritt, eine CD in Ihr geklontes Projekt zu erstellen
cd <shallow cloned project dir>
Öffnen Sie nun den Klon Schritt für Schritt
git fetch --depth=N, with increasing N
zB
git fetch --depth=4
dann
git fetch --depth=100
Dann können Sie
git fetch --depth=500
auswählen, wie viele Schritte Sie möchten, indem Sie dieses N ersetzen.
und schließlich alle verbleibenden Revisionen herunterladen Verwenden Sie
git fetch --unshallow
upvote, wenn es Ihnen hilft 🙂
Antwort
Ich habe dies dank der obigen Informationen endlich zum Laufen gebracht. Ich habe die Datei direkt bearbeitet und Fehler erhalten, indem ich versehentlich die Anführungszeichen eingefügt habe. Ihre .git / info / sparse-checkout-Datei sollte nur das Verzeichnis und keine Anführungszeichen enthalten. Hier ist ein Beispiel: Dieses gigantische Projekt: https://github.com/SharePoint/sp-dev-fx-webparts , ich wollte nur den React-Script-Editor im Beispielverzeichnis. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / Reaktion-Skript-Editor
Ich habe die obigen Anweisungen befolgt und es zum Laufen gebracht, als meine .git / info / sparse-checkout-Datei genau dies enthielt.
samples / react-script-editor
Antwort
Dadurch wird ein bestimmter Ordner geklont und der gesamte Verlauf entfernt, der nichts damit zu tun hat.
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
Kommentare
- Dadurch werden weiterhin der gesamte Verlauf (
--depth=1
zur Vermeidung) und alle anderen Verzeichnisse ( zu vermeiden?).
Antwort
Für GitHub-Repos können Sie jedes Sub klonen -Verzeichnisse eines GitHub-Repositorys (an einer beliebigen Referenz) mit https://github.com/HR/github-clone
Kommentare
- Leider ist dies für Dockerfile-Szenarien ungeeignet, da es Python als Abhängigkeit einbinden würde, um es nur einmal während der Image-Erstellung zu verwenden.
Antwort
Ich werde mit bestimmten Einschränkungen antworten, mit denen ich konfrontiert war.
- In VSO wurde SSH aus Sicherheitsgründen deaktiviert, sodass das Git-Archiv nicht verwendet werden konnte. Nur PAT / CredentialProvider wurde unterstützt.
- Unser Zweig hatte enormen Code, also Git-Klon Dies würde mindestens 15 Minuten dauern.
Folgendes habe ich getan:
- Einmaliger manueller Vorgang: Erstellen Sie in der VSO-Benutzeroberfläche einen neuen Der Remote-Zweig sagt „emptyBranch“, der keine Dateien enthält (alle werden gelöscht).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(ziemlich schnell) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(nur bestimmten Ordner auschecken)