Ist es möglich, Unterverzeichnisse eines Repositorys in Git auszuchecken?
Stellen Sie sich vor, ich richte eine neue WordPress-Installation ein. Ich werde zwei neue Verzeichnisse für meine Plugin- und Theme-Anpassung erstellen:
wordpress/wp-content/plugins/myplugins/
wordpress/wp-content/themes/mytheme/
Ich möchte diese Verzeichnisse über Git pflegen. In Subversion, würde ich dies erreichen , indem er trunk/myplugins/
und trunk/mytheme/
Verzeichnisse und Unterverzeichnisse heraus überprüfen. Hat Git eine Möglichkeit, dieselbe Aufgabe mit einem einzigen Repository zu erledigen?
Ich könnte das Boot in einem Git-Paradigma einfach vermissen, als langjähriger SVN-Benutzer mit wenig Kontakt zu Git.
Bearbeiten: Mehrere Zweige, in denen unterschiedliche Inhalte gespeichert sind, sind eine interessante Möglichkeit, damit umzugehen.
quelle
Antworten:
Sparse Checkout gibt es jetzt in Git 1.7 .
Siehe auch die Frage „ Ist es möglich, eine spärliche Prüfung durchzuführen, ohne zuerst das gesamte Repository auszuchecken? ”.
Beachten Sie, dass Sie bei spärlichen Kassen immer noch das gesamte Repository herunterladen müssen , auch wenn einige der von Git heruntergeladenen Dateien nicht in Ihrem Arbeitsbaum landen.
quelle
git clone
einfacher Befehl? Nun, ich benutze diese Antwort und arbeite!/foo/bar/foobar
, kann ich es nur wie/foobar
in meinem lokalen Repository sehen?Es gibt keinen wirklichen Weg, dies in Git zu tun. Und wenn Sie nicht als einzelne Arbeitseinheit Änderungen vornehmen, die beide Bäume gleichzeitig betreffen, gibt es keinen guten Grund, für beide ein einziges Repository zu verwenden. Ich dachte, ich würde diese Subversion-Funktion vermissen, aber ich stellte fest, dass das Erstellen von Repositorys so wenig Verwaltungsaufwand verursacht (einfach aufgrund der Tatsache, dass Repositorys direkt neben ihrer Arbeitskopie gespeichert werden, anstatt dass ich explizit einen Ort außerhalb von auswählen muss Arbeitskopie), an die ich mich gewöhnt habe, nur viele kleine Einzweck-Repositories zu erstellen.
Wenn Sie darauf bestehen (oder es wirklich brauchen), können Sie ein Git-Repository mit just
mytheme
undmyplugins
Verzeichnissen erstellen und diese aus der WordPress-Installation heraus verknüpfen.MDCore schrieb:
Beachten Sie, dass dies für git kein Problem darstellt, wenn Sie sich entscheiden, beide Verzeichnisse in einem einzigen Repository abzulegen, da git das Konzept der monoton steigenden Versionsnummern jeglicher Form vollständig aufhebt.
Das einzige Kriterium für die Zusammenstellung von Dingen in einem einzigen Repository in Git ist, ob es sich um eine einzelne Einheit handelt, d. H. in Ihrem Fall, ob es Änderungen gibt, bei denen es nicht sinnvoll ist, die Änderungen in jedem Verzeichnis isoliert zu betrachten. Wenn Sie Änderungen haben, bei denen Sie Dateien in beiden Verzeichnissen gleichzeitig bearbeiten müssen und die Änderungen zusammengehören, sollten sie ein Repository sein. Wenn nicht, dann glom sie nicht zusammen.
Git möchte wirklich, dass Sie separate Repositorys für separate Entitäten verwenden.
Submodule erfüllen nicht den Wunsch, beide Verzeichnisse in einem Repository zu behalten, da sie tatsächlich ein separates Repository für jedes Verzeichnis erzwingen würden , das dann mithilfe von Submodulen in einem anderen Repository zusammengeführt wird. Schlimmer noch, da die Verzeichnisse in der WordPress-Installation keine direkten Unterverzeichnisse desselben Verzeichnisses sind und auch Teil einer Hierarchie mit vielen anderen Dateien sind, würde die Verwendung der Verzeichnis-Repositorys als Submodule in einem einheitlichen Repository keinerlei Vorteile bieten, da die einheitlichen Das Repository würde keinen Anwendungsfall / Bedarf widerspiegeln.
quelle
git clone
einfache Befehlsfolge? Nun, ich benutze diese Antwort und arbeite!Eine Sache, die ich an spärlichen Checkouts nicht mag, ist, dass Ihre Verzeichnisstruktur alle Verzeichnisse enthalten muss, die dazu führen, wenn Sie ein Unterverzeichnis auschecken möchten, das einige Verzeichnisse tief ist.
Um dies zu umgehen, klone ich das Repo an einem Ort, der nicht mein Arbeitsbereich ist, und erstelle dann in meinem Arbeitsbereichsverzeichnis einen symbolischen Link zum Unterverzeichnis im Repository. Git funktioniert so ganz gut, weil Dinge wie der Git-Status die Änderungsdateien relativ zu Ihrem aktuellen Arbeitsverzeichnis anzeigen.
quelle
Tatsächlich befinden sich "enge" oder "teilweise" oder "spärliche" Kassen derzeit in einer starken Entwicklung für Git. Beachten Sie, dass Sie immer noch das vollständige Repository unter haben
.git
. Die anderen beiden Beiträge sind für den aktuellen Status von Git aktuell, aber es sieht so aus, als könnten wir irgendwann spärliche Kassen durchführen. Überprüfen Sie die Mailinglisten, wenn Sie an weiteren Details interessiert sind - sie ändern sich schnell.quelle
git clone --filter
ab Git 2.19Diese Option überspringt das Abrufen nicht benötigter Objekte vom Server:
Der Server sollte konfiguriert sein mit:
Ab Version 2.19.0 gibt es keine Serverunterstützung, diese kann jedoch bereits lokal getestet werden.
file://$(path)
ist erforderlich, umgit clone
Protokoll-Spielereien zu überwinden : Wie kann ein lokales Git-Repository mit einem relativen Pfad flach geklont werden ?Denken Sie daran, dass dies
--depth 1
bereits impliziert--single-branch
, siehe auch: Wie klone ich einen einzelnen Zweig in Git?TODO:
--filter=blob:none
Überspringt alle Blobs, ruft aber trotzdem alle Baumobjekte ab. Bei einem normalen Repo sollte dies jedoch im Vergleich zu den Dateien selbst winzig sein, sodass dies bereits gut genug ist. Gefragt unter: https://www.spinics.net/lists/git/msg342006.html Entwickler antworteten--filter=tree:0
, dass dies in Arbeit ist.Das Format von
--filter
ist am dokumentiertman git-rev-list
.Das Git-Remote-Protokoll wurde erweitert, um diese Funktion zu unterstützen.
Dokumente auf Git-Baum:
Probieren Sie es aus
GitHub stromaufwärts .
Ausgabe in Git v2.19:
Schlussfolgerungen: Alle Blobs von außerhalb
d1/
fehlen.Beachten Sie, dass
root/root
undmybranch/mybranch
auch fehlen,--depth 1
verbirgt dies jedoch in der Liste der fehlenden Dateien. Wenn Sie entfernen--depth 1
, werden sie in der Liste der fehlenden Dateien angezeigt.quelle
Wie Ihre Bearbeitung zeigt, können Sie zwei separate Zweige verwenden, um die beiden separaten Verzeichnisse zu speichern. Dadurch bleiben beide im selben Repository, aber Sie können immer noch keine Commits für beide Verzeichnisbäume haben. Wenn Sie eine Änderung in einer haben, die eine Änderung in der anderen erfordert, müssen Sie diese als zwei separate Commits ausführen, und Sie eröffnen die Möglichkeit, dass zwei Kassen der beiden Verzeichnisse nicht mehr synchron sind.
Wenn Sie das Verzeichnispaar als eine Einheit behandeln möchten, können Sie 'wordpress / wp-content' als Stammverzeichnis Ihres Repos verwenden und die .gitignore-Datei auf der obersten Ebene verwenden, um alles außer den beiden interessierenden Unterverzeichnissen zu ignorieren. Dies ist derzeit wahrscheinlich die vernünftigste Lösung.
Angeblich gibt es seit zwei Jahren spärliche Kassen, aber es gibt immer noch keine Anzeichen dafür im Git Development Repo und auch keine Hinweise darauf, dass die notwendigen Änderungen jemals dort eintreffen werden. Ich würde nicht auf sie zählen.
quelle
Sie können kein einzelnes Verzeichnis eines Repositorys auschecken, da das gesamte Repository vom einzelnen .git-Ordner im Stammverzeichnis des Projekts anstelle der unzähligen .svn-Verzeichnisse von subversion verwaltet wird.
Das Problem bei der Arbeit an Plugins in einem einzelnen Repository besteht darin, dass durch das Festschreiben von z. B. mytheme die Versionsnummer für myplugin erhöht wird. Daher ist es auch bei Subversion besser, separate Repositorys zu verwenden.
Das Subversion-Paradigma für Teilprojekte lautet svn: externals, was sich etwas in Submodule in git übersetzt (aber nicht genau für den Fall, dass Sie zuvor svn: externals verwendet haben.)
quelle
Hier gibt es eine Inspiration. Einfach nutzen
shell regex
odergit regex
.Verwenden Sie das Zitat, um der Shell-Regex-Interpretation zu entgehen und Platzhalter an git zu übergeben.
Die erste ist nicht rekursiv, sondern nur Dateien in einer Tiefe
subdir
. Aber der zweite ist rekursiv.In Bezug auf Ihre Situation kann Folgendes ausreichen.
Hacken Sie einfach die Zeilen nach Bedarf.
quelle
Sie können nicht festgeschriebene Änderungen nur auf eine bestimmte Datei oder ein bestimmtes Verzeichnis zurücksetzen:
quelle