2014-10-20 20 views
6

Ich arbeite an einer Website mit Sharelatex(github), aber es enthält andere Repositories, die verwendet werden, um das Hauptprojekt zu erstellen. Ich klonte das Haupt-Repository und habe grunt install, die zum Herunterladen dieser Repositories verwendet wird.Pflege von Git Repo mit anderen geklonten Git Repo

Aber das Problem ist, dass ich den Code im Haupt-Repository und den heruntergeladenen ändern muss.

Da diese Projekte neue Updates erhalten können, möchte ich diese Änderungen auch zusammenführen. Ich muss auch ein Repo halten, aber wenn ich Änderungen an Github drücke, zeigt es nur Änderungen im Hauptrepo an.

Ich bin in Git auf submodules gestoßen, aber da das Hauptprojekt keine Untermodultypen enthält, kann ich das nicht verwenden.

Zum Beispiel:

Es ist ein Repo web im Hauptprojekt verwendet. Ich beginne mit einigen Änderungen in den Dateien in web. Ich muss diese Änderungen in meinem Remote-Repository widerspiegeln, damit andere sie verwenden können.

Nun nehmen Sie an, dass nach einiger Zeit ein wichtiges Update für web Repo verfügbar ist, wie soll ich das verwenden?

Ich gebe grunt install in der Befehlszeile ein, um diesen Repo herunterzuladen. Es erzeugt kein Submodul, sondern Klone, die in meinen Ordner repotieren, was anschließend von meinem Haupt-Git Repo ignoriert wird.

Die Frage scheint vielleicht unklar, aber ich habe mein Bestes versucht, das Problem zu erklären.

In der Nußschale:

  • Ich möchte nicht nur Änderungen in den beiden Haupt-und einer anderen Repo auszuführen, die beteiligt ist, sondern ziehen und die anderen repos zu verschmelzen, als auch, wenn ihre Updates verfügbar sind .

  • Ich muss auch ein Remote-Repo meines Projekts pflegen.

Antwort

6

Ich arbeite auf einer Website mit Sharelatex (Github), aber es enthält andere Repository, die verwendet werden, um das Hauptprojekt zu bauen. [...] Ich bin in git auf Submodule gestoßen, aber da das Hauptprojekt kein Submodul enthält, kann ich das nicht nutzen.

Eigentlich haben Sie ein Submodul. Das ist, was ein verschachteltes Repository ist, und (soweit ich es ernst meinen) soweit, was Sie wissen müssen, um Submodule zu knacken, das ist alles gibt es zu Submodulen. Um Submodule zu verstehen, stellen Sie sich vor, Sie hätten ein geschachteltes Repository (Sie tun dies) und denken über die administrativen Anforderungen nach, was getan werden muss, um dieses Setup in einem dvcs zu unterstützen.

Wenn Leute ein Projekt klonen, das Submodule aus irgendeinem Repo verwendet, haben Sie alle entschieden, veröffentlichte Commits zu enthalten, dieser Klon wird offensichtlich auch nicht das Subprojekt-Repository bekommen (sicherlich sollte es nicht Ihre private und gott- weiß-was-du-hast-es-schon-gemacht-version). Sie müssen also das Teilprojekt Repo von einem seiner eigenen veröffentlichten Repositories erhalten.

Wie sagen Sie den Leuten, die Ihre Commits holen, wo Sie die nötigen Subprojekt-Commits erhalten?Offensichtlich müssen Sie eine Notiz irgendwo in einer festgeschriebenen Datei ablegen und sagen: "Hier ist ein Repo, der alle nötigen Subprojekt-Commits haben sollte". git submodule hat sich auf .gitmodules als der herkömmliche Ort, um solche Notizen zu speichern.

Nächste Seite: nun, was sind andere zu tun, wenn die URL, die du ihnen gegeben hast, offline geht? Sie werden einfach ein anderes Repo verwenden müssen. Daher .gitmodules ist nur Vorschläge, die git submodule Befehl verwendet die aktuellen Werte in Ihrem .git/config, git submodule init hat von den vorgeschlagenen in .gitmodules "bevölkert".

git submodule die Operationen sind alle so. Vergiss es. Schaue dir den Befehl nicht einmal an, bis du etwas Hilfe brauchst, um das zu tun, was du bereits herausgefunden hast. Beginnen Sie mit dem Wissen, der einfachen Tatsache, dass ein Submodul nichts anderes als ein verschachtelter Repo ist, und das Projekt, das es verwendet, verpflichtet nichts weiter als eine Commit-ID, die irgendwo in diesem verschachtelten Repo sein soll. Das ist es. Das ist alles ein Submodul ist.

Während Sie langwierige Aufgaben erledigen, suchen Sie nach einem Unterbefehl git submodule, der sie für Sie erledigt. Sie müssen den Unterbefehl nicht verwenden. Alles, was dieser Unterbefehl tut, ist die Automatisierung einfacher Aufgaben, die sonst mühsam wären. Es ist ein Toolkit, um zu tun, was immer Sie tun müssen, und es gibt keinen Weg auf der Welt, es könnte oder sollte willkürlich und ausreichend (< - das ist der schwierige Teil) Abstraktion über jeden auf der Welt auferlegen. Es ist also eine Wundertüte.

Das heißt, es gibt eine wichtige Sicherheits-Spiel git submodule update und git submodule add für Sie durchführen, wenn sie die git clone für Sie tun. Repositories haben üblicherweise den eigentlichen Repo-Inhalt unter dem [sub] Projekt Toplevel .git, aber wenn Sie einen Zweig auschecken, der dieses Teilprojekt nicht hat oder dieses Teilprojekt anderweitig brauchen oder wollen, wird auch sein .git weggehen - nicht was Sie wollen, wenn es nicht nur Ihren ausgecheckten Inhalt enthält, sondern den gesamten tatsächlichen Repo. Wenn git submodule update seinen ursprünglichen Klon ausführt, hebt es das Verzeichnis .git des Submoduls in einen handlichen (und willkürlichen) kleinen Winkel im Repo des enthaltenden Projekts und ersetzt das Verzeichnis .git, das gerade aus dem Submodul mit einer .git-Datei verschoben wurde, die den relativen Pfad zu enthält das verschobene Verzeichnis

Um dieses anfängliche Hochziehen auf dem Repo durchzuführen, das Sie derzeit haben, verschieben Sie es aus Ihrem aktuellen Repo, fügen Sie hinzu und aktualisieren Sie von wo auch immer Sie es setzen, und beheben Sie dann die Upstream-URLs in .gitmodules für die Bequemlichkeit anderer.

Dort. Jetzt wissen Sie absolut alles, was Sie wissen müssen, um git Submodule zu verstehen und inkrementell Details nur dann zu erfassen, wenn Sie sie brauchen, um zu verstehen, was der Befehl für Sie tut, und warum Sie sich nicht wirklich darum kümmern müssen, jedes kleine zu verstehen Ding auf seiner Manpage vorne. Zumindest glaube ich das.

Wenn ich etwas wichtiges verpasst habe, wäre ich sehr froh über (sanfte oder stumpfe, das ist mir wirklich egal) Korrekturen in den Kommentaren.