Wie man ein vorhandenes Verzeichnis in ein git-repository git submodule
Ich bin sehr verwirrt über git-Submodule.
Im Grunde mein problem ist, dass kann ich nicht machen, git verstehen, dass ~/main-project/submodule
ist ein Submodul.
Ich habe gute Erfahrungen mit git Submodule:
in meinem dotfiles-repository ich die erstellt habe .gitmodules-Datei in ~/dotfiles-repo
und ich fügte hinzu, es Pfade und urls. Seit dann, Wenn ich änderungen an den Dateien innerhalb der Submodule und führen git status
ich bekommen würde, sowas wie: .vim/bundle/auto-complete (new commits) # in red
Habe ich die .gitmodules
Datei in ~/main-project
aber:
- Wenn ich änderungen an
~/main-project/submodule
und sogar push die änderungen, die ich nicht bekommen, eine ähnliche Antwort wie<submodule> (new commits) # in red
beim laufengit status
im~/main-project
. Ich bekomme nur die änderungen, die vorgenommen wurden, in diesen Verzeichnissen -
Wenn ich auf den Ordner " links auf
github
für diese Verzeichnisse es ist nicht Regie mich auf die repositories selbst, aber ich bleibe im gleichen repository.- Vielleicht fehlt mir der springende Punkt. Was sind die wichtigsten Merkmale der Submodule?
- Warum git versteht, die Submodule in die dotfiles-repo aber nicht in meinen anderen repo?
- Ist es, weil ich schon gesagt habe-git hinzufügen der Dateien in
~/main-project/submodule
auf den index?
Habe ich gelesen diese Frage das führte mich zu diese Antwort Aber ich bin mir nicht sicher, ich brauche git-subtree
. Ich will nicht, Dinge zu tun, tun könnten, änderungen, die nur schwer zu wiederherstellen.
Edit: Dieser Vorschlag duplizieren-Lösung hat nicht funktioniert, ich erhielt eine Fehlermeldung, dass
Updates were rejected because the remote contains work that you do not have locally
. Es scheint, dass @GabLeRoux praktisch sagte mir zu schieben<repo-A>
auf die url<repo-B>
.
- Zu Ihren wichtigsten äußeren repository Git-Submodul wird nur eine weitere Datei. Also sehen Sie nicht die änderungen innerhalb der submodule erscheinen in
git status
auf der Außenseite. - Möglich, Duplikat der Erstellen Sie ein Submodul-repository von einem Ordner und halten Sie Ihre git commit-Historie
- Siehe: stackoverflow.com/a/44699112/1122851
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Lösung ganz einfach. Es wurde extrahiert aus hier.
git rm submodule-dir
Dies wird alle Dateien löschen, die von git war das tracking nach in
submodule-dir
rm -rf submoduledir
Dies löscht alle Dateien aus, die linke hätte in
submodule-dir
da git ignoriert Sie.git commit
Nach dem commit, reinigten wir die Dateien, die git gefolgt und hat nicht gefolgt in
submodul-dir
.Jetzt ist es Zeit zu tun:
git submodule add <remote-path-to-submodule>
Dies wird wieder hinzufügen die submodule, sondern als true-Submodul.
.gitmodules
und sehen, ob die teilmodule erfolgreich Hinzugefügt wurden. In meinem Fall hatte ich bereits ein.gitmodules
Datei also musste ich es ändern.BEARBEITEN
Seit v2.12.0-rc0, und nach diese verpflichten, erhielten Wir
git submodule absorbgitdirs
und Es ist genau das, was ich brauchte, zu der Zeit, als ich gepostet diese Frage stellen.Dies ist, was die docs state dieser Befehl nicht:
Also statt der Ausgangspunkt aller wie bereits in den vorherigen Antworten von @DomQ und mich kann man nur hinzufügen, führen Sie die folgenden:
.gitmodules
und zu.git/config
mitgit submodule add <url> <path>
$GIT_DIR
Verzeichnis (.git
im regulären repositories) zu.git/modules/<path>
mitgit submodule absorbgitdirs <path>
rm -rf submoduledir
fühlt sich gefährlich... ich würde einemv submoduledir submoduledir.backup
bis ich sehen kann, dass die anderen Kommandos gearbeitet. (Ja, ich bin ein bisschen paranoid.)Es gibt im Grunde keinen besseren Weg, als er vorgibt zu starten über:
git submodule add
aus dem sub-repository remotecd mysubmodule
git fetch ../wherever/you/stashed/the/sub-repository/in/step-1
git merge FETCH_HEAD
Zu erklären, warum das so ist, es scheint mir, als einem tieferen Verständnis von dem, was teilmodule sind benötigt wird, als das, was man auflesen kann von der
git-submodule(1)
Handbuch-Seite (oder sogar die relevante Kapitel aus dem Git-Buch). Ich fand einige tiefergehende Erklärungen auf in diesem blog-post, aber seit diesem post ist etwas langatmig, nehme ich die Freiheit fassen Sie hier.Auf einem niedrigen Niveau, ein git-Submodul besteht aus den folgenden Elementen,
.git/modules
Gastgeber der Git-Objekte für das Submodul,.gitmodules
Konfigurationsdatei.Die commit-Objekt enthalten ist (oder genauer gesagt, referenziert durch SHA1) in der parent-tree-Objekt. Dies ist ungewöhnlich, wie die Dinge in der Regel umgedreht, aber das erklärt, warum sehen Sie ein Verzeichnis angezeigt, in das Haupt-repository ist
git status
nach Ausführung einer commit in der submodule. Sie können auch einige Experimente mitgit ls-tree
zu beobachten, diese commit-Objekt im detail.Unterverzeichnis in
.git/modules
steht für eine.git
Unterverzeichnis, in dem Submodul; und in der Tat, es ist ein.git
Datei in die submodule, die Punkte, um die ehemaligen mit einemgitdir:
Linie. Dies ist das Standardverhalten seit version 1.7.8 von Git. Nicht sicher, warum alles nicht Nur Arbeit, wenn Sie nur gehalten, auf eine separate.git
Verzeichnis, außer, wie bereits in den release notes würden Sie wahrscheinlich in Schwierigkeiten geraten, wenn eine Umschaltung zwischen einem ast, hat das Submodul und die anderen nicht.Den
.gitmodules
- Datei enthält die URL, diegit submodule update --remote
und Freunde sollte ziehen aus; die offensichtlich unterscheidet sich von der Haupt-repository Satz von Fernbedienungen. Beachten Sie auch, dass.gitmodules
kopiert, zum Teil in.git/config
durch diegit submodule sync
- Befehl und andere Befehle, die es aufrufen, hinter den kulissen.Während es ziemlich einfach ist, um die notwendigen änderungen von hand für
.gitmodules
+.git/config
, und auch für.git/modules
+mysubmodule/.git
(und in der Tat, es gibt sogargit submodule absorbgitdirs
für die letzteren), es ist nicht wirklich ein Porzellan zu schaffen, nur die in-tree commit-Objekt. Daher ist die vorgeschlagene Lösung durch verschieben + nochmal änderungen, die oben präsentiert.Beantworten Ihre Fragen in der Reihenfolge:
git rm --cached submodule-name/
. Dann erstellen Sie eine temporäre Begehen, gefolgt durch das hinzufügen der Ordner als repository:git add submodule-name
(beachten Sie, dass es keine nachgestellten Schrägstrich nach Submodul-name für den Fall der teilmodule).Den Antwort Sie erwähnt werden, können korrigieren Sie die Geschichte Ihres begeht auch:
Diesem Ordner werden so behandelt, als ein Submodul in alle deine commit-Historie, nicht nur für alle Zukunft verpflichtet. Dies vermeidet Komplikationen, wenn Sie zur Kasse, um eine frühere version, wo es behandelt wurde wie ein Ordner. Dies ist eine Komplikation, weil, wenn Sie wieder an die Spitze der Ihre Niederlassung haben, müssen Sie möglicherweise geben Sie Ihre Submodul auch und Check-out die neuesten commit, um alle Dateien wiederherzustellen (die gelöscht werden können, die aus Ihrem Arbeitsverzeichnis). Dies kann vermieden werden, indem Sie eine Art rekursive zur Kasse, um Ihre neuesten Begehen.
Wenn die commit-Geschichte ist geändert, alle anderen Beitragszahler müssten auch die re-clone das Projekt, da bekommen Sie merge-Konflikten oder noch schlimmer; wieder das problem commits in das Projekt zurück.