2014-01-12 3 views
13

Ich habe meine erste Git Submodul Erfahrung.Wie Submodule öffentlich zu verwenden, aber Symlinks zu einem einzelnen Klon lokal?

Ich habe einige Projekte, die auf dem gleichen Teilprojekt abhängen. Ich halte diese Projekte synchron, also verwende ich die "submodule branch" feature (z. B. git submodule add -b master [URL]).

Während ich möchte, dass die öffentlichen GitHub-Repositorys die Submodul-Beziehung vermitteln, möchte ich in meinem eigenen Workflow wirklich nur einen Klon der geteilten Codebasis auf meiner Festplatte haben. Ich dachte, ich könnte einfach die Submodule einrichten und dann einen Umschalter mit einer symbolischen Verbindung machen. Aber wenn ich es tue, bekomme ich diese:

On branch master 
Changes not staged for commit: 
(use "git add <file>..." to update what will be committed) 
(use "git checkout -- <file>..." to discard changes in working directory) 

    typechange: draem 

So anscheinend Git die Tatsache sieht, dass es ein symbolischer Link, statt nach durch in das Verzeichnis.

Gibt es einen Workflow, bei dem ich scheinbar mit Submodulen arbeite, aber wirklich nur einen Klon in meinem lokalen Dateisystem habe?

Antwort

1

So sieht Git anscheinend die Tatsache, dass es ein symbolischer Link ist, anstatt durch das Verzeichnis zu folgen.

Ja, würde Git eine solche Änderung sehen, denn das Submodul in der Mutter Repo als special entry in the index deklariert wird.

Die Erstellung eines Symlinks würde diesen speziellen Eintrag durch eine Datei eines anderen Typs ersetzen.

Was Sie könnte versuchen mit GIT_WORK_TREE spielen (wie in "Including submodules in git checkout to GIT_WORK_TREE in hook").

Aber eine einfachere Lösung wäre:

  • Ihre Submodul rechts halten, wo sie sind.
  • fügen Sie einen weiteren Klon dieses Submodul Repo, wo Sie es wollen (/path/to/sub).
  • erkennen Sie Änderungen aus dem ursprünglichen Submodul-Ordner mit einem git --work-tree=/path/to/sub Status aus dem Ordner Ihres duplizierten Submoduls in den übergeordneten Repos.
+0

Danke ... das Erkennen von Änderungen und Haken Sache klingt wie eine gute Antwort für komplexere Projekte. Aber in diesem Stadium brauche ich wirklich etwas Einfaches. Ich habe festgestellt, dass die Dinge scheinbar gut funktionieren, indem ich diesen Klon auf die Seite bringe und ihn verlinke, und dann das Submodul für die Commits einfach nicht einchecke. Hacky, aber es scheint zu funktionieren * (wenn ich nichts vermisse ...) * – HostileFork

1

Ich persönlich würde nicht empfehlen, Submodule verschiedener Projekte auf den gleichen Code zu zeigen. Wenn der Code aus dem Submodul wirklich sehr groß ist, könnte es ein Argument sein, aber in den meisten Situationen würde ich es nicht tun.

Dies kann auch gut sein, weil Sie im Submodul eines Ihrer Projekte entwickeln können und nicht die anderen beeinflussen.

+0

Danke, aber in meinem Fall ist es eigentlich mühsamer, mit den mehreren Synchronisationen umzugehen. Obwohl ich sehe, dass verschiedene Projektstatus einen Vorteil in einem komplizierteren Projekt bieten, das von mehreren Leuten bearbeitet wird ... ist für mich bei diesem Projekt der Reifegrad nur ein zusätzlicher Aufwand. – HostileFork

+0

Es kann sehr nützlich sein, zu vermeiden, dass viele Commits von partiellem Code erstellt werden, nur um sicherzustellen, dass Änderungen erstellt werden. Etwas, das man mit einem Squash meiden konnte, ist natürlich aber immer noch leicht zu verarbeiten. –

2

(Schätzen Sie die anderen Ratschläge, aber die Beantwortung mit dem, was ich zu tun habe entschieden, weil es am einfachsten ist.)

Put-Klone der Submodule Sie in ihren eigenen Verzeichnissen zu teilen planen.

Dann richten Sie Dinge, wie Sie möchten in den Verwendung von Projekten, jede mit ihren eigenen Klon der Submodule, die Sie teilen möchten.Sobald die Projekte so eingerichtet sind, dass neue Benutzer die Submodule normal abrufen können, ersetzen Sie die Submodulverzeichnisse durch freigegebene symbolische Links zu Ihrer lokalen Instanz, in der Sie Ihre Änderungen vornehmen, und fügen Sie sie dem .gitignore hinzu.

(und nicht nur die Submodul-basierte Verzeichnisse zu löschen, können Sie sie aus dem Weg umbenennen möchten. Sie könnten sie dann an den richtigen Platz zurück und ziehen Sie diese gegebenenfalls.)

So ist der Arbeitsstil ist das Submodul/typechange niemals zu übergeben. Solange Sie bereit sind, den Master-Zweig immer zu verfolgen, werden Leute, die das Projekt klonen, immer noch das Richtige bekommen. In der Zwischenzeit können Sie mit dem einzelnen Repository auf Ihrer Festplatte arbeiten.

Für Projekte in einem fortgeschrittenen Stadium hat @VonC wahrscheinlich die richtige Antwort ... um Git nicht zu belügen, checken Sie die Submodule in den entsprechenden Zuständen ein und verwenden Sie Trigger, um die Updates zu verwalten.

+0

Interessanter Ansatz. +1 – VonC

+0

Bitte erklären Sie mir, wie ich das am einfachsten mache. Derzeit leiden genau das gleiche Problem. Ich bin nicht in der Lage zu bekommen ** Get it eingecheckt. **? – Aryan

+0

@AbhishekAryan "eingecheckt" ist alte Programmiersprache für "commit and push". Ich habe diesem Ansatz etwas mehr Details hinzugefügt. Es ist nichts Schickes, und eine schlechte Idee für ernsthafte Arbeit - die sich mit bestimmten Commits auf Submodulen synchronisieren sollte, anstatt immer den Master zu ziehen. Mehr Komfort für jemanden, der alleine in einem frühen Stadium der Projektentwicklung arbeitet. – HostileFork

2

können Sie binden das Submodul der andere Verzeichnis

sudo mount --bind /path/to/main/repo relative/path/to/submodule 

ich viele Informationen über diese Methode finden kann nicht montieren, sondern sahen es in this, ähnliche Frage aufgeführt.

Verwandte Themen