Wie kann ich clone ein Unterverzeichnis, das nur von einem Git-repository?
Habe ich meine Git-repository, welches, an der Wurzel, hat zwei Unterverzeichnisse:
/finisht
/static
Als dies noch in SVN, /finisht
ausgecheckt war, in einem Ort, während /static
geprüft wurde, die anderswo, etwa so:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
Gibt es eine Möglichkeit, dies zu tun mit Git?
mögliche Duplikate von Kasse Unterverzeichnisse im Git?
Für 2014 ist der Benutzer, was die
Für diejenigen, die versuchen zu Klonen Sie den Inhalt des repository (nicht das anlegen der root-Ordner), ist dies eine sehr einfache Lösung: stackoverflow.com/questions/6224626/...
Diese Frage ist über die Auschecken Unterverzeichnisse in Git (was einfach ist), während dieser Frage ist Klonen Unterverzeichnisse in Git (was unmöglich ist).
Als Git-2.19, veröffentlicht vor 3 Wochen, dies endlich möglich ist, wie gesehen werden kann in dieser Antwort: stackoverflow.com/a/52269934/2988 Erwägen, akzeptieren, dass jetzt ein. Hinweis: in Git 2.19, nur client-side-Unterstützung ist implementiert, server-side-Unterstützung fehlt noch, so funktioniert es nur, wenn das Klonen lokalen repositories. Beachten Sie auch, dass große Git-Hoster, z.B. GitHub nicht wirklich die Git-server, die Sie verwenden, Ihre eigene Implementierung, so dass selbst wenn die Unterstützung zeigt sich in der Git-server, es bedeutet nicht automatisch, dass es funktioniert auf Git-Hoster. (OTOH, Sie verwirklichen könnte es schneller.)
Für 2014 ist der Benutzer, was die
git clone
einfachste Befehl?? Ich verwendete die einfache Antwort. Wenn es etwas einfach, kommentieren Sie bitteFür diejenigen, die versuchen zu Klonen Sie den Inhalt des repository (nicht das anlegen der root-Ordner), ist dies eine sehr einfache Lösung: stackoverflow.com/questions/6224626/...
Diese Frage ist über die Auschecken Unterverzeichnisse in Git (was einfach ist), während dieser Frage ist Klonen Unterverzeichnisse in Git (was unmöglich ist).
Als Git-2.19, veröffentlicht vor 3 Wochen, dies endlich möglich ist, wie gesehen werden kann in dieser Antwort: stackoverflow.com/a/52269934/2988 Erwägen, akzeptieren, dass jetzt ein. Hinweis: in Git 2.19, nur client-side-Unterstützung ist implementiert, server-side-Unterstützung fehlt noch, so funktioniert es nur, wenn das Klonen lokalen repositories. Beachten Sie auch, dass große Git-Hoster, z.B. GitHub nicht wirklich die Git-server, die Sie verwenden, Ihre eigene Implementierung, so dass selbst wenn die Unterstützung zeigt sich in der Git-server, es bedeutet nicht automatisch, dass es funktioniert auf Git-Hoster. (OTOH, Sie verwirklichen könnte es schneller.)
InformationsquelleAutor Nick Sergeant | 2009-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN: Als Git-2.19, dies endlich möglich ist, wie gesehen werden kann in dieser Antwort: https://stackoverflow.com/a/52269934/2988.
Betrachten upvoting Antwort.
Hinweis: in Git 2.19, nur client-side-Unterstützung ist implementiert, server-side-Unterstützung fehlt noch, so funktioniert es nur, wenn das Klonen lokalen repositories. Beachten Sie auch, dass große Git-Hoster, z.B. GitHub, die eigentlich gar nicht die Git-server, die Sie verwenden, Ihre eigene Implementierung, so dass selbst wenn die Unterstützung zeigt sich in der Git-server, es bedeutet nicht automatisch, dass es funktioniert auf Git-Hoster. (OTOH, da Sie nicht die Git-server, die Sie verwirklichen könnte schneller in Ihre eigenen Implementierungen vor, es zeigt sich in den Git-server.)
Nein, das ist nicht möglich in Git.
Umsetzung so etwas wie dies in Git wäre ein erheblicher Aufwand und es würde bedeuten, dass die Integrität der clientseitigen repository nicht mehr gewährleistet werden konnte. Wenn Sie interessiert sind, suchen Sie nach Diskussionen über "sparse-Klon" und "sparse fetch" auf der git-Mailingliste.
Im Allgemeinen, der Konsens in der Git community ist, dass, wenn Sie mehrere Verzeichnisse, die werden immer geprüft, unabhängig, dann sind diese wirklich zwei verschiedene Projekte und Leben sollten in zwei verschiedenen Repositorys. Sie können kleben Sie wieder zusammen mit Git-Submodule.
Sparse checkouts passieren, während
git-read-tree
, die lange nachget-fetch
. Die Frage war nicht über die Check-out nur ein Unterverzeichnis ist, war es über Klonen nur auf ein Unterverzeichnis. Ich sehe nicht, wie sparse-checkouts vielleicht tun könnte, dass, dagit-read-tree
läuft nach dem Klonen bereits abgeschlossen hat.Anstatt dieser "stub", möchten Sie für mich zu löschen, diese Antwort so Chronial können Schwimmer an die Spitze? Sie können nicht löschen Sie es selbst, weil es akzeptiert, aber ein moderator kann. Sie halten würde, der Ruf, den Sie sich verdient haben von ihm, da er so alt ist dass. (Ich kam in dieses, weil jemand, der gekennzeichnet als "link-nur". 🙂
Chronial Antwort noch Klone das gesamte repository und nicht nur auf ein Unterverzeichnis. (Der Letzte Absatz auch explizit so sagt.) Klonen nur ein Unterverzeichnis ist nicht möglich in Git. Das Netzwerk-Protokoll nicht unterstützt, ist es, das Speicher-format nicht unterstützt.
href="https://stackoverflow.com/a/52269934/1269037">Ciro Santili Antwort scheint zu widersprechen.
InformationsquelleAutor Jörg W Mittag
Was Sie versuchen zu tun, ist genannt sparse checkout, und das feature wurde Hinzugefügt, in git 1.7.0 (Feb. 2012). Die Schritte, die zu tun eine spärliche Klon sind wie folgt:
Dadurch wird ein leeres repository mit dem remote -, und holt alle Objekte, aber nicht überprüfen Sie Sie heraus. Dann tun:
Nun müssen Sie definieren, welche Dateien/Ordner, die Sie wollen, um tatsächlich zu überprüfen. Dies geschieht durch die Auflistung Sie in
.git/info/sparse-checkout
, zB:Last but not least, aktualisieren Sie Ihre leeren repo mit dem Zustand von der Fernbedienung:
Müssen Sie jetzt die Dateien "ausgecheckt" für
some/dir
undanother/sub/tree
auf dem file-system (mit denen diese Pfade noch), und keine anderen Wege vorhanden.Möchten Sie vielleicht einen Blick auf die erweiterte tutorial und Sie sollten wahrscheinlich Lesen Sie die offizielle Dokumentation für sparse-checkout.
Als Funktion:
Verwendung:
Beachten Sie, dass dies immer noch download des gesamten repository vom server – nur die Kasse ist in der Größe reduziert. Im moment ist es nicht möglich zu Klonen, nur ein einziges Verzeichnis. Aber wenn Sie nicht brauchen, die Geschichte des Repositorys, können Sie zumindest sparen Sie Bandbreite durch die Schaffung eines flachen Klon. Sehen udondan Antwort unten für Informationen, wie Sie kombinieren flache Klon und sparse-checkout.
Es ist eine Verbesserung, aber muss noch downloaden und speichern Sie eine vollständige Kopie der remote-repository origin, die man vielleicht vermeiden können, wenn er interessiert ist, nur Teile der Codebasis (oder, wenn es Dokumentation Unterordner wie in meinem Fall)
Gibt es eine Möglichkeit, zu Klonen gewünschte Verzeichnis Inhalt (nicht die Ordner selbst) in meinen repository? Zum Beispiel möchte ich Klonen Inhalt
https://github.com/Umkus/nginx-boilerplate/tree/master/src
rechts in/etc/nginx
Sie sind beide richtig / falsch 😛 Die
git remote add
Befehl nicht bedeutet eine Holen, abergit remote add -f
, wie hier verwendet, bedeutet! Das ist es, was die-f
bedeutet.Mit dieser und
--depth=1
ich geklont Chromium Devtools 338 MB statt 4.9 GB voll, Blinkt source + Geschichte. Ausgezeichnet.InformationsquelleAutor Chronial
Können Sie kombinieren die sparse checkout und die shallow clone Funktionen. Die shallow clone schneidet die Geschichte und die sparse checkout nur zieht die Dateien passend zu Ihrem Muster.
Müssen Sie mindestens git 1.9 für diese zu arbeiten. Es selber getestet nur mit der 2.2.0 und 2.2.2.
Diese Weise werden Sie noch in der Lage, push, das ist nicht möglich, mit
git archive
.Dies ist sinnvoll, und vielleicht die best mögliche Antwort, aber es immer noch clones die Inhalte, die Sie nicht interessieren (wenn es auf die Filiale, die Sie ziehen), obwohl es nicht zeigen, bis in der Kasse.
nicht für mich arbeiten, wenn der Letzte Befehl nicht
git pull --depth=1 origin master
abergit pull --depth=1 origin <any-other-branch>
. das ist so seltsam, siehe meine Frage hier: stackoverflow.com/questions/35820630/...Auf Windows -, die zweite-to-Letzte Zeile muss das weglassen der Anführungszeichen, oder das ziehen schlägt fehl.
Diese noch downloads alle Daten! Fand diese Lösung, die mit svn: stackoverflow.com/a/18324458/2302437
InformationsquelleAutor udondan
git clone --filter
aus dem Git 2.19Diese option wird tatsächlich überspringen Sie Holen nicht mehr benötigte Objekte vom server:
Dem server konfiguriert werden sollten:
Eine Erweiterung wurde vorgenommen, um die Git-remote-Protokoll für die Unterstützung dieser Funktion in v2.19.0, aber es gibt keine server-Unterstützung in dieser Zeit. Aber es kann schon sein lokal getestet.
TODO:
--filter=blob:none
überspringt alle blobs, aber trotzdem holt allen Baum-Objekte. Aber an einem normalen repo, dies sollte klein sein im Vergleich zu den Dateien selbst, so ist dies bereits gut genug. Gefragt in: https://www.spinics.net/lists/git/msg342006.html Devs, antwortete ein--filter=tree:0
ist in den Werken zu tun.Denken Sie daran, dass
--depth 1
schon sagt--single-branch
siehe auch: Wie kann ich clone nur einen branch in Git?file://$(path)
erforderlich ist, zu überwindengit clone
Protokoll Spielereien: Wie "shallow clone" ein lokales git-repository mit einem relativen Pfad?Format
--filter
ist dokumentiert aufman git-rev-list
.Docs auf Git-Baum:
Testen Sie es aus
GitHub upstream.
Ausgabe in Git v2.19.0:
Schlussfolgerungen: alle blobs, die von außerhalb
d1/
fehlen. E. g.0975df9b39e23c15f63db194df7f45c76528bccb
, died2/b
ist nicht es nach dem Check-outd1/a
.Beachten Sie, dass
root/root
undmybranch/mybranch
fehlen auch noch, aber--depth 1
versteckt, aus der Liste der fehlenden Dateien. Wenn Sie entfernen--depth 1
, dann zeigen Sie auf die Liste der fehlenden Dateien.Ich habe einen Traum
Diese Funktion revolutionieren könnte Git.
Vorstellen, dass alle die code-Basis von Ihrem Unternehmen in einem einzigen repo ohne hässlich third-party-tools wie
repo
.Vorstellen die Speicherung von großen blobs direkt in die repo-ohne hässliche third-party-extensions.
Vorstellen, wenn GitHub erlauben würde pro Datei /Verzeichnis Metadaten wie Sterne und Berechtigungen, so können Sie speichern alle Ihre persönlichen Sachen unter einem einzelnen repo.
Vorstellen, wenn teilmodule wurden genauso behandelt werden wie normale Verzeichnisse: verlangen Sie einfach einen Baum SHA, und ein DNS-ähnlichen Mechanismus löst Ihre Anfrage, ersten Blick auf Ihr lokale
~/.git
, dann erstmal näher Servern (Ihres Unternehmens mirror /cache) und landen dann auf GitHub.vielleicht ist es nicht zu wissen, was das Leben interessant macht 😉
InformationsquelleAutor Ciro Santilli 新疆改造中心996ICU六四事件
Für andere Benutzer, die nur herunterladen möchten eine Datei/Ordner von github, verwenden Sie einfach:
z.B.
(ja, das svn hier. offenbar im Jahr 2016 müssen Sie noch svn zu laden Sie einfach einige github-Dateien)
Courtesy: Laden Sie einen einzelnen Ordner oder einen Ordner aus einem GitHub-repo
Wichtig - Stellen Sie sicher, aktualisieren Sie die github-URL und ersetzen Sie
/tree/master/
mit '/trunk/'.Als bash-Skript:
Hinweis
Diese Methode lädt einen Ordner, nicht clone/Kasse. Sie können nicht drücken Sie die änderungen zurück in das repository. Auf der anderen Seite - das Ergebnis sind kleinere download-im Vergleich zu sparse-checkout oder flach Kasse.
Habe versucht zu tun, mit
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
bekam abersvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
Fehler 🙁Sie müssen entfernen 'trunk' vor udacity, und ersetzen /tree/master/ mit /trunk/ statt.
Dieser Befehl war die eine, die für mich gearbeitet! Ich wollte nur eine Kopie einer Datei aus dem repo, also könnte ich es ändern lokal. Gute alte SVN ist die Rettung!
es funktioniert, aber zu langsam erscheint. dauert ein bisschen, um zu starten und dann die Dateien Rolle durch die relativ langsam
InformationsquelleAutor Anona112
Wenn Sie nie planen, um die Interaktion mit dem repository, aus dem Sie geklont, die Sie tun können, eine vollständige git clone und schreiben Sie Ihre Ablage mit git filter-branch --subdirectory-filter. Auf diese Weise, zumindest die Geschichte wird bewahrt werden.
git filter-branch --subdirectory-filter <subdirectory>
Diese Methode hat den Vorteil, dass das Unterverzeichnis, das Sie wählen, wird die Wurzel des neuen repository, in dem zufällig genau das, was ich will.
git log --all
zeigt immer noch alle logs..InformationsquelleAutor hillu
Git 1.7.0 hat "sparse checkouts". Sehen
“Kern.sparseCheckout" in der git config man-page,
"Sparse checkout" in der git read-tree man-page, und
"Skip-worktree bit" in der git update-index man-page.
Die Schnittstelle ist nicht so bequem wie SVN ist (z.B. es gibt keinen Weg, um eine sparse-checkout an der Zeit, eine erste Klon), aber die Basis-Funktionalität, auf die einfachere Schnittstellen gebaut werden konnte, ist jetzt verfügbar.
InformationsquelleAutor Chris Johnsen
Diese sieht viel einfacher:
Dies funktioniert mit bitbucket =)
Wenn Sie mit github können Sie
svn export
stattFunktioniert nicht mit Github --> Ungültiger Befehl: "git-upload-Archiv" xxx/yyy.git" Sie zu sein scheinen, mit ssh clone git:// URL. Stellen Sie sicher, Ihr Kern.gitProxy config-option und die GIT_PROXY_COMMAND Umgebungsvariable NICHT gesetzt werden. fatal: The remote end hung up unerwartet
Der Grund, warum dies nicht funktioniert mit GitHub: "Wir unterstützen nicht die Verwendung von git-Archiv zu ziehen Sie ein Archiv direkt von GitHub. Sie können entweder clone das repo lokal, und führen Sie git-Archiv, oder klicken Sie auf den Download ZIP button auf der repo Seite." github.com/xuwupeng2000/capistrano-scm-gitcopy/issues/16
InformationsquelleAutor ErichBSchulz
Ist es nicht möglich zu Klonen Unterverzeichnis nur mit Git, aber unten sind einige Problemumgehungen.
Filter-branch
Möchten Sie vielleicht schreiben Sie die repository zu schauen, als wenn
trunk/public_html/
gewesen sein Projekt-root, und verwerfen alle andere Geschichte (mitfilter-branch
), versuchen Sie, auf bereits checkout branch:Hinweise: Die
--
trennt filter-branch-Optionen von Revisionen, und die--all
umschreiben aller Zweige und tags. Alle Informationen, einschließlich der ursprünglichen commit-Zeiten-oder merge-Informationen werden erhalten. Dieser Befehl Ehrungen.git/info/grafts
- Datei und die refs in derrefs/replace/
namespace, so, wenn Sie irgendwelche Späne oder Ersatzrefs
definiert, wenn Sie diesen Befehl ausführen dauerhaft.Sparse checkout
Hier sind einfache Schritte, mit sparse-checkout Konzept, das Auffüllen der working-directory Dünn, so kann man sagen, Git, welche(N) Ordner oder Datei(en) in das Arbeitsverzeichnis lohnt sich.
Clone repository wie gewohnt (
--no-checkout
ist optional):- Sie können überspringen Sie diesen Schritt, wenn Sie Ihr repository bereits geklont.
Hinweis: Für die großen repos, sollten "shallow clone" (
--depth 1
) an der Kasse nur die Letzte revision oder/und--single-branch
nur.Aktivieren
sparseCheckout
option:Ordner angeben(s) für sparse-checkout (ohne Leerzeichen am Ende):
oder Bearbeiten
.git/info/sparse-checkout
.Kasse der Filiale (z.B.
master
):Jetzt sollten Sie über die ausgewählten Ordner in Ihrem aktuellen Verzeichnis.
Können Sie prüfen, symbolische links, wenn Sie haben zu viele Ebenen von Verzeichnissen oder filtern Niederlassung statt.
pull
?Nein.
filter-branch
würde, schreiben die Eltern verpflichtet, so dass Sie würde haben unterschiedliche SHA1-IDs, und damit die gefilterten Baum hätte keine commits, die gemeinsam mit den entfernten Baum.git pull
wissen nicht, wo Sie versuchen, Seriendruck aus.InformationsquelleAutor kenorb
Ich nur ein script geschrieben für GitHub.
Verwendung:
Und anscheinend ist dies für Download ein Verzeichnis, nicht Klonen ein Stück des repo-mit allen Metadaten... richtig?
Sie sollten Sie hier den code und nicht irgendwo anders.
InformationsquelleAutor david_adler
Hier ist ein shell-Skript, das ich schrieb für die Verwendung bei einem einzigen Unterverzeichnis sparse checkout
coSubDir.sh
ln -s ./.$localRepo/$subDir $localRepo
stattln -s ./.$localRepo$subDir $localRepo
InformationsquelleAutor jxramos
Wird dieser Klon einen bestimmten Ordner, und entfernen Sie die ganze Geschichte nicht.
InformationsquelleAutor BARJ