Ich habe mein Git-Repository, das im Stammverzeichnis zwei Unterverzeichnisse hat:
/finisht
/static
Wenn dies in SVN war , /finisht
wurde es an einem Ort ausgecheckt , während /static
es an anderer Stelle ausgecheckt wurde, wie folgt:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
Gibt es eine Möglichkeit, dies mit Git zu tun?
git
repository
subdirectory
git-clone
sparse-checkout
Nick Sergeant
quelle
quelle
git clone
einfachste Befehl? Ich habe diese einfache Antwort verwendet . Wenn es etwas Einfacheres gibt, kommentieren Sie bitteAntworten:
EDIT : Ab Git 2.19 ist dies endlich möglich, wie aus dieser Antwort hervorgeht .
Erwägen Sie, diese Antwort zu verbessern.
Hinweis: In Git 2.19 ist nur die clientseitige Unterstützung implementiert. Die serverseitige Unterstützung fehlt noch, sodass sie nur beim Klonen lokaler Repositorys funktioniert. Beachten Sie auch, dass große Git-Hoster, z. B. GitHub, den Git-Server nicht verwenden, sondern ihre eigene Implementierung. Selbst wenn die Unterstützung auf dem Git-Server angezeigt wird, bedeutet dies nicht automatisch, dass sie auf Git-Hostern funktioniert. (OTOH, da sie den Git-Server nicht verwenden, können sie ihn in ihren eigenen Implementierungen schneller implementieren, bevor er auf dem Git-Server angezeigt wird.)
Nein, das ist in Git nicht möglich.
Die Implementierung von so etwas in Git wäre ein erheblicher Aufwand und würde bedeuten, dass die Integrität des clientseitigen Repositorys nicht mehr garantiert werden kann. Wenn Sie interessiert sind, suchen Sie auf der Git-Mailingliste nach Diskussionen zu "Sparse Clone" und "Sparse Fetch".
Im Allgemeinen besteht in der Git-Community der Konsens, dass wenn Sie mehrere Verzeichnisse haben, die immer unabhängig ausgecheckt werden, dies wirklich zwei verschiedene Projekte sind und in zwei verschiedenen Repositorys leben sollten. Sie können sie mit Git-Submodulen wieder zusammenkleben .
quelle
git-read-tree
, was lange danach istget-fetch
. Bei der Frage ging es nicht darum, nur ein Unterverzeichnis auszuchecken, sondern nur ein Unterverzeichnis zu klonen . Ich sehe nicht ein, wie spärliche Kassen dies möglicherweise tun könnten, dagit-read-tree
der Klon bereits abgeschlossen ist.Was Sie versuchen, wird als spärliches Auschecken bezeichnet , und diese Funktion wurde in Git 1.7.0 (Februar 2012) hinzugefügt. Die Schritte zum Erstellen eines Sparse- Klons lauten wie folgt:
Dadurch wird mit Ihrer Fernbedienung ein leeres Repository erstellt und alle Objekte abgerufen, aber nicht ausgecheckt. Dann mach:
Jetzt müssen Sie definieren, welche Dateien / Ordner Sie tatsächlich auschecken möchten. Dies geschieht durch Auflisten in
.git/info/sparse-checkout
z.Zu guter Letzt aktualisieren Sie Ihr leeres Repo mit dem Status von der Fernbedienung:
Sie haben jetzt Dateien für
some/dir
und "ausgecheckt"another/sub/tree
auf Ihrem Dateisystem (mit diesen Pfaden noch) und keine anderen Pfade vorhanden.Vielleicht möchten Sie sich das erweiterte Tutorial ansehen und sollten wahrscheinlich die offizielle Dokumentation für spärliches Auschecken lesen .
Als eine Funktion:
Verwendungszweck:
Beachten Sie, dass dadurch weiterhin das gesamte Repository vom Server heruntergeladen wird - nur der Checkout wird verkleinert. Derzeit ist es nicht möglich, nur ein einziges Verzeichnis zu klonen. Wenn Sie jedoch den Verlauf des Repositorys nicht benötigen, können Sie zumindest Bandbreite sparen, indem Sie einen flachen Klon erstellen. Siehe udondan Antwort unten für Informationen darüber , wie seicht zu kombinieren Klon und spärliche Kasse.
Ab Git 2.25.0 (Januar 2020) wird in Git ein experimenteller Sparse-Checkout- Befehl hinzugefügt:
quelle
https://github.com/Umkus/nginx-boilerplate/tree/master/src
Right in/etc/nginx
git remote add
Befehl ist nicht implizieren eine holen, abergit remote add -f
, wie hier verwendet, tut! Das ist was das-f
bedeutet.--depth=1
ich Chromium Devtools in 338 MB anstelle von 4,9 GB vollständigem Blink-Quell- + Verlauf geklont. Ausgezeichnet.git clone --filter
ab Git 2.19Diese Option überspringt das Abrufen nicht benötigter Objekte vom Server. Auch
--filter=tree:0
ab Git 2.20 und dem--filter=combine
in Git 2.24 hinzugefügten Composite-Filter erhalten wir:Der Server sollte konfiguriert sein mit:
Das Git-Remote-Protokoll wurde erweitert, um diese Funktion in zu unterstützen
v2.19.0
und das Abrufen nicht benötigter Objekte zu überspringen. Derzeit wird jedoch kein Server unterstützt. Es kann aber schon lokal getestet werden.Befehlsaufschlüsselung:
--filter=blob:none
Überspringt alle Blobs, ruft aber trotzdem alle Baumobjekte ab--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: Wie klone ich einen einzelnen Zweig in Git?file://$(path)
ist erforderlich, umgit clone
Protokoll-Spielereien zu überwinden : Wie kann ein lokales Git-Repository mit einem relativen Pfad flach geklont werden ?--filter=combine:FILTER1+FILTER2
ist die Syntax, mehrere Filter gleichzeitig zu verwenden. Der Versuch,--filter
aus irgendeinem Grund zu übergeben, schlägt fehl mit: "Mehrere Filterspezifikationen können nicht kombiniert werden". Dies wurde in Git 2.24 unter e987df5fe62b8b29be4cdcdeb3704681ada2b29e "Listenobjektfilter: Verbundfilter implementieren" hinzugefügt.Das Format von
--filter
ist am dokumentiertman git-rev-list
.Dokumente auf Git-Baum:
Probieren Sie es aus
GitHub stromaufwärts .
Ausgabe in Git v2.19.0:
Schlussfolgerungen: Alle Blobs von außerhalb
d1/
fehlen. ZB0975df9b39e23c15f63db194df7f45c76528bccb
, wasd2/b
nach dem Auschecken nicht da istd1/a
.Beachten Sie, dass
root/root
undmybranch/mybranch
auch fehlen, aber--depth 1
das aus der Liste der fehlenden Dateien verbirgt. Wenn Sie entfernen--depth 1
, werden sie in der Liste der fehlenden Dateien angezeigt.Ich habe einen Traum
Diese Funktion könnte Git revolutionieren.
Stellen Sie sich vor, Sie haben die gesamte Codebasis Ihres Unternehmens in einem einzigen Repo ohne hässliche Tools von Drittanbietern
repo
.Stellen Sie sich vor, Sie speichern riesige Blobs direkt im Repo ohne hässliche Erweiterungen von Drittanbietern .
Stellen Sie sich vor, GitHub würde Metadaten wie Sterne und Berechtigungen pro Datei / Verzeichnis zulassen , sodass Sie alle Ihre persönlichen Daten unter einem einzigen Repo speichern können.
Stellen Sie sich vor, Submodule würden genau wie reguläre Verzeichnisse behandelt : Fordern Sie einfach eine Baum-SHA an, und ein DNS-ähnlicher Mechanismus löst Ihre Anfrage auf . Schauen Sie zuerst auf Ihren lokalen
~/.git
Server, dann auf nähere Server (den Spiegel / Cache Ihres Unternehmens) und landen Sie auf GitHub.quelle
fatal: invalid filter-spec 'combine:blob:none+tree:0'
Danke trotzdem! Vielleicht funktioniert es mit neueren Versionen.Sie können die Funktionen für spärliches Auschecken und flache Klone kombinieren . Der flache Klon schneidet den Verlauf ab und die spärliche Kasse zieht nur die Dateien, die Ihren Mustern entsprechen.
Sie benötigen mindestens Git 1.9, damit dies funktioniert. Habe es selbst nur mit 2.2.0 und 2.2.2 getestet.
Auf diese Weise können Sie immer noch pushen , was mit nicht möglich ist
git archive
.quelle
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/…Für andere Benutzer, die nur eine Datei / einen Ordner von github herunterladen möchten, verwenden Sie einfach:
z.B
(Ja, das ist SVN hier. Anscheinend benötigen Sie 2016 noch SVN, um einfach einige Github-Dateien herunterzuladen.)
Mit freundlicher Genehmigung: Laden Sie einen einzelnen Ordner oder ein einzelnes Verzeichnis von einem GitHub-Repo herunter
Wichtig - Stellen Sie sicher, dass Sie die Github-URL aktualisieren und ersetzen
/tree/master/
'/ trunk /' .Als Bash-Skript:
Hinweis Diese Methode lädt einen Ordner herunter und klont / checkt ihn nicht aus. Sie können Änderungen nicht in das Repository zurückschieben. Auf der anderen Seite führt dies zu einem geringeren Download im Vergleich zu einem spärlichen oder flachen Checkout.
quelle
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
aber bekamsvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
Fehler :(Wenn Sie nie vorhaben, mit dem Repository zu interagieren, aus dem Sie geklont haben, können Sie einen vollständigen Git-Klon erstellen und Ihr Repository mithilfe des Git-Filter-Zweigs - Unterverzeichnis-Filter neu schreiben . Auf diese Weise bleibt zumindest die Geschichte erhalten.
quelle
git filter-branch --subdirectory-filter <subdirectory>
git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir
Das sieht viel einfacher aus:
quelle
svn export
stattdessen verwendenGit 1.7.0 hat "spärliche Kassen". Siehe „core.sparseCheckout“ in der git config - Man - Page „Sparse Kasse“ in der git las Baum manpage und „Überspringen-worktree Bit“ im git update-Index manpage .
Die Schnittstelle ist nicht so praktisch wie die von SVNs (z. B. gibt es zum Zeitpunkt eines ersten Klons keine Möglichkeit, eine spärliche Prüfung durchzuführen), aber die Basisfunktionalität, auf der einfachere Schnittstellen aufgebaut werden könnten, ist jetzt verfügbar.
quelle
Es ist nicht möglich, ein Unterverzeichnis nur mit Git zu klonen, aber im Folgenden finden Sie einige Problemumgehungen.
Zweig filtern
Möglicherweise möchten Sie das Repository so umschreiben, dass es so aussieht, als wäre
trunk/public_html/
es das Projektstammverzeichnis, und den gesamten anderen Verlauf verwerfen (mithilfe vonfilter-branch
). Versuchen Sie es mit dem bereits ausgecheckten Zweig:Hinweise:
--
Diese Option trennt Filterzweigoptionen von Revisionsoptionen und--all
schreibt alle Zweige und Tags neu. Alle Informationen, einschließlich der ursprünglichen Festschreibungszeiten oder Zusammenführungsinformationen, bleiben erhalten . Dieser Befehl berücksichtigt.git/info/grafts
Dateien und Verweise imrefs/replace/
Namespace. Wenn Sie also Transplantate oder Ersetzungenrefs
definiert haben, werden diese durch Ausführen dieses Befehls dauerhaft.Sparsame Kasse
Hier sind einfache Schritte mit spärlichem Checkout- Ansatz, bei denen das Arbeitsverzeichnis nur spärlich gefüllt wird, sodass Sie Git mitteilen können, welche Ordner oder Dateien im Arbeitsverzeichnis einen Check-out wert sind.
Klonen Sie das Repository wie gewohnt (
--no-checkout
optional):Sie können diesen Schritt überspringen, wenn Sie Ihr Repository bereits geklont haben.
Hinweis: Bei großen Repos sollten Sie den flachen Klon (
--depth 1
) in Betracht ziehen, um nur die neueste Version oder / und--single-branch
nur auszuchecken .sparseCheckout
Option aktivieren :Geben Sie Ordner für das Auschecken mit geringer Dichte an ( ohne Leerzeichen am Ende):
oder bearbeiten
.git/info/sparse-checkout
.Kasse der Filiale (zB
master
):Jetzt sollten Sie Ordner in Ihrem aktuellen Verzeichnis ausgewählt haben.
Sie können symbolische Links in Betracht ziehen, wenn Sie stattdessen zu viele Ebenen von Verzeichnissen oder Filterzweigen haben.
quelle
pull
?filter-branch
würde die übergeordneten Commits neu schreiben, damit sie unterschiedliche SHA1-IDs haben, und somit würde Ihr gefilterter Baum keine Commits mit dem Remote-Baum gemeinsam haben.git pull
Ich würde nicht wissen, wo ich versuchen soll, mich zusammenzuschließen.Ich habe gerade ein Skript für GitHub geschrieben .
Verwendungszweck:
quelle
Dadurch wird ein bestimmter Ordner geklont und der gesamte Verlauf entfernt, der nicht damit zusammenhängt.
quelle
Hier ist ein Shell-Skript, das ich für den Anwendungsfall einer einzelnen Unterverzeichnis-Sparse-Prüfung geschrieben habe
coSubDir.sh
quelle
ln -s ./.$localRepo/$subDir $localRepo
anstelle vonln -s ./.$localRepo$subDir $localRepo
Ich habe eine
.gitconfig
[alias]
für die Durchführung einer "spärlichen Kasse" geschrieben. Probieren Sie es aus (kein Wortspiel beabsichtigt):Unter Windows laufen in
cmd.exe
Andernfalls:
Verwendung :
Die
git config
Befehle werden aus Bequemlichkeits- und Speichergründen "minimiert", aber hier ist der erweiterte Alias:quelle
L=${1##*/} L=${L%.git}
? Ist der Weltraum ein Operator?Verwenden Sie Linux? Und wollen nur leicht zugänglichen und sauberen Arbeitsbaum? ohne den Rest des Codes auf Ihrem Computer zu stören. versuche symlinks !
Prüfung
quelle
Um einige der großartigen Antworten hier zu verdeutlichen, setzen die in vielen Antworten beschriebenen Schritte voraus, dass Sie bereits irgendwo über ein Remote-Repository verfügen.
Gegeben: ein vorhandenes Git-Repository, z. B.
[email protected]:some-user/full-repo.git
mit einem oder mehreren Verzeichnissen, die Sie unabhängig vom Rest des Repos abrufen möchten , z. B. Verzeichnisse mit den Namenapp1
undapp2
Angenommen, Sie haben ein Git-Repository wie oben beschrieben ...
Dann: Sie können Schritte wie die folgenden ausführen, um nur bestimmte Verzeichnisse aus diesem größeren Repo abzurufen:
Ich habe fälschlicherweise gedacht, dass die Sparse-Checkout-Optionen im ursprünglichen Repository festgelegt werden müssen: Dies ist nicht der Fall. Sie definieren, welche Verzeichnisse Sie lokal möchten, bevor Sie von der Fernbedienung abrufen. Hoffe, diese Klarstellung hilft jemand anderem.
quelle
Während ich es hasse, svn tatsächlich verwenden zu müssen, wenn ich mit Git-Repos zu tun habe: / Ich benutze dies die ganze Zeit;
Auf diese Weise können Sie ohne Änderungen aus der Github-URL kopieren. Verwendungszweck;
quelle
Wenn Sie nur an den neuesten Revisionsdateien eines Verzeichnisses interessiert sind, können Sie mit Github ein Repository als Zip-Datei herunterladen, die keinen Verlauf enthält. Das Herunterladen ist also sehr viel schneller.
quelle
Also habe ich alles in diesem Profil ausprobiert und nichts hat bei mir funktioniert ... Es stellt sich heraus, dass Sie dies in Version 2.24 von Git (der Version, die zum Zeitpunkt dieser Antwort mit cpanel geliefert wurde) nicht tun müssen
Sie benötigen lediglich den Ordnernamen
Kurz gesagt, du machst das
Anschließend bearbeiten Sie die Datei .git / info / sparse-checkout und fügen die Ordnernamen (einen pro Zeile) mit / * am Ende hinzu, um Unterordner und Dateien abzurufen
Speichern Sie den Befehl checkout und führen Sie ihn aus
Das Ergebnis war der erwartete Ordner aus meinem Repo und nichts anderes Upvote, wenn dies für Sie funktioniert hat
quelle