2008-10-07 4 views
132

Können Unterverzeichnisse eines Repositorys in Git ausgecheckt werden?Kasse Unterverzeichnisse in Git?

Stellen Sie sich vor, ich richte eine neue WordPress-Installation ein. Ich werde zwei neue Verzeichnisse für mein Plugin und Themenanpassung erstellen:

  • wordpress/wp-content/plugins/myplugins/
  • wordpress/wp-content/themes/mytheme/

ich diese Verzeichnisse über Git pflegen wollen. In Subversion würde ich dies erreichen, indem ich Verzeichnisse trunk/myplugins/ und trunk/mytheme/ habe und Unterverzeichnisse auschecke. Hat Git eine Möglichkeit, die gleiche Aufgabe mit einem einzigen Repository zu erledigen?

Ich könnte nur das Boot auf einem Git-Paradigma vermissen, als langjähriger SVN-Benutzer mit wenig Kontakt zu Git.

Bearbeiten:Multiple branches Speichern verschiedener Inhalte ist eine interessante Möglichkeit, damit umzugehen.

+2

Warum checken Sie nicht den gesamten Repo aus und stellen Sie eine symbolische Verbindung zu den Unterverzeichnissen her, mit denen Sie arbeiten möchten? – lhe

+3

mögliches Duplikat von [Gibt es eine Möglichkeit, nur das Unterverzeichnis eines Git-Repositorys zu klonen?] (Http://stackoverflow.com/questions/600079/is-there-any-way-to-clone-a-git-repositorys -sub-directory-only) – MariuszS

+0

[Einfache Antwort hier] (http://stackoverflow.com/a/2466755/287948). –

Antwort

109

Sparse checkouts sind now in Git 1.7.

Siehe auch die Frage "Is it possible to do a sparse checkout without checking out the whole repository first?".

Beachten Sie, dass Sparse-Checkouts Sie immer noch benötigen Download das gesamte Repository, auch wenn einige der Dateien Git Downloads nicht in Ihrem Arbeitsbaum landen wird.

+1

Woot! Danke für das Update. –

+1

Wo de 'Git Klon' einfachen Befehl ?? Nun, ich benutze [diese Antwort] (http://stackoverflow.com/a/2466755/287948), funktioniert! –

18

Es gibt keine echte Möglichkeit, das in Git zu tun. Und wenn Sie keine Änderungen vornehmen, die beide Bäume gleichzeitig als einzelne Arbeitseinheit betreffen, gibt es keinen Grund, ein einziges Repository für beide zu verwenden. Ich dachte, ich würde diese Subversion-Funktion vermissen, aber ich fand, dass das Erstellen von Repositories so wenig administrativen Aufwand verursacht (einfach aufgrund der Tatsache, dass Repositories direkt neben ihrer Arbeitskopie gespeichert sind, anstatt dass ich explizit einen Platz außerhalb des Arbeitskopie), dass ich mich daran gewöhnt habe, viele kleine Einzweck-Repositories zu machen.

Wenn Sie darauf bestehen (oder wirklich brauchen), könnten Sie ein Git-Repository mit nur mytheme und myplugins Verzeichnisse erstellen und diese aus der WordPress-Installation heraus verlinken.


MDCore schrieb:

zu einem Commit zu machen, zum Beispiel mytheme wird die Revisionsnummer für myplugin

Hinweis erhöhen, dass dies kein Problem für git , wenn Sie sich dazu entschließen, beide Verzeichnisse in einem einzigen Repository zu speichern, da git das Konzept monoton steigender Revisionsnummern jeder Form vollständig eliminiert.

Das einzige Kriterium für die Zusammenstellung der Dinge in einem einzigen Repository in git ist, ob es sich um eine Einheit handelt, d. in Ihrem Fall, ob es Änderungen gibt, bei denen es keinen Sinn ergibt, die Editierungen in jedem Verzeichnis isoliert zu betrachten. Wenn Sie Änderungen haben, bei denen Sie Dateien in beiden Verzeichnissen gleichzeitig bearbeiten müssen und die Änderungen zusammen gehören, sollten sie ein Repository sein. Wenn nicht, dann glimme sie nicht zusammen.

Git möchte wirklich, dass Sie separate Repositories für separate Entitäten verwenden.

submodules

Submodule Adresse nicht den Wunsch beide Verzeichnisse in einem Repository zu halten, denn sie würden tatsächlich erzwingen für jedes Verzeichnis ein separates Repository mit, die dann zusammengebracht werden in anderen Repository mit Submodulen. 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 pro-Verzeichnis-Repositories als Submodule in einem einheitlichen Repository keinerlei Vorteile bieten Repository würde keinen Anwendungsfall/-bedarf widerspiegeln.

+0

Danke; das war ein bisschen ein Hirn Furz über Git mit Revisionsnummern :) – MDCore

+0

Wo de 'git Klon' einfache Befehlssequenz ?? Nun, ich benutze [diese Antwort] (http://stackoverflow.com/a/2466755/287948), funktioniert! –

3

Sie können ein einzelnes Verzeichnis eines Repositorys nicht auschecken, da das gesamte Repository vom einzelnen .git-Ordner im Stammverzeichnis des Projekts statt von unzähligen .svn-Verzeichnissen von subversion verwaltet wird.

Das Problem mit der Arbeit an Plugins in einem einzigen Repository ist, dass ein Commit machen zu, zum Beispiel mytheme wird die Revisionsnummer für myplugin, so auch in Subversion ist es besser, verwenden getrennte Repositories erhöhen.

Das Subversion-Paradigma für Teilprojekte ist svn:externals, die etwas zu submodules in git übersetzt (aber nicht genau in dem Fall haben Sie svn verwendet. Vor Externen)

10

Eigentlich „schmal“ oder „teilweise“ oder "spärliche" Checkouts sind für Git aktuell und stark entwickelt. Hinweis: Sie haben immer noch das vollständige Repository unter .git. Also, die anderen zwei Beiträge sind aktuell für den aktuellen Zustand von Git, aber es sieht wie wir in der Lage, spärliche Checkouts schließlich tun werden. Checkout the mailing lists Wenn Sie an mehr Details interessiert sind - sie ändern sich schnell.

+0

Gut zu wissen! Ich mag solche eng verwandten Verzeichnisse unter einem Repository und würde es tun, wenn es überhaupt möglich ist. –

1

Wie Ihre Änderung hervorhebt, können Sie zwei separate Zweige verwenden, um die zwei separaten Verzeichnisse zu speichern. Dadurch bleiben sie beide im selben Repository, Sie können jedoch keine Commits für beide Verzeichnisbäume erstellen. Wenn Sie eine Änderung in einer ändern, die eine Änderung in der anderen erfordert, müssen Sie dies als zwei separate Commits tun, und Sie öffnen die Möglichkeit, dass ein Paar Checkouts der beiden Verzeichnisse nicht mehr synchron sein können.

Wenn Sie das Verzeichnispaar als eine Einheit behandeln möchten, können Sie 'wordpress/wp-content' als Wurzel Ihres Repos verwenden und die .gitignore-Datei auf oberster Ebene verwenden, um alle außer den zwei Unterverzeichnissen zu ignorieren Interesse. Dies ist wahrscheinlich die vernünftigste Lösung an dieser Stelle.

Sparse Checkouts kommen angeblich seit zwei Jahren, aber es gibt immer noch keine Anzeichen von ihnen in der Git-Entwicklung Repo, noch Anzeichen dafür, dass die notwendigen Änderungen jemals dort ankommen werden. Ich würde nicht auf sie zählen.

10

Eine Sache, die ich über Sparse Checkouts nicht mag, ist, dass, wenn Sie ein Unterverzeichnis, das ein paar Verzeichnisse tief ist, auschecken, Ihre Verzeichnisstruktur alle Verzeichnisse enthalten muss, die dazu führen.

Wie funktioniert das, klonen Sie das Repo an einem Ort, der nicht mein Arbeitsbereich ist, und erstellen Sie dann einen symbolischen Link in meinem Arbeitsbereich-Verzeichnis in das Unterverzeichnis im Repository. Git funktioniert so gut, weil Dinge wie Git Status die Änderungsdateien relativ zu Ihrem aktuellen Arbeitsverzeichnis anzeigen.