Sie haben den vendor/plugins/open_flash_chart_2
Eintrag "gitlink" hinzugefügt , ihn jedoch nie als Submodul definiert. Tatsächlich verwenden Sie die interne Funktion, die das Git-Submodul verwendet (Gitlink-Einträge), aber Sie verwenden nicht die Submodul-Funktion selbst.
Sie haben wahrscheinlich so etwas gemacht:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Dieser letzte Befehl ist das Problem. Das Verzeichnis vendor/plugins/open_flash_chart_2
beginnt als unabhängiges Git-Repository. Normalerweise werden solche Unter-Repositorys ignoriert. Wenn Sie jedoch git add anweisen, es explizit hinzuzufügen, wird ein Gitlink-Eintrag erstellt, der auf das HEAD-Commit des Unter-Repositorys verweist, anstatt den Inhalt des Verzeichnisses hinzuzufügen. Es könnte schön sein, wenn git add sich weigern würde, solche „Semi-Submodule“ zu erstellen.
Normale Verzeichnisse werden in Git als Baumobjekte dargestellt. Baumobjekte geben den darin enthaltenen Objekten Namen und Berechtigungen (normalerweise andere Baum- und Blob-Objekte - Verzeichnisse bzw. Dateien). Submodule werden als "Gitlink" -Einträge dargestellt. Gitlink-Einträge enthalten nur den Objektnamen (Hash) des HEAD-Commits des Submoduls. Das „Quell-Repository“ für das Commit eines Gitlinks wird in der .gitmodules
Datei angegeben (und in der .git/config
Datei, sobald das Submodul initialisiert wurde).
Was Sie haben, ist ein Eintrag, der auf ein bestimmtes Commit verweist, ohne das Quell-Repository für dieses Commit aufzuzeichnen. Sie können dies beheben, indem Sie Ihren Gitlink entweder zu einem geeigneten Submodul machen oder indem Sie den Gitlink entfernen und durch „normalen“ Inhalt (einfache Dateien und Verzeichnisse) ersetzen.
Verwandle es in ein richtiges Submodul
Das einzige Bit, das Sie vermissen, um es richtig vendor/plugins/open_flash_chart_2
als Submodul zu definieren, ist eine .gitmodules
Datei. Normalerweise (wenn Sie es nicht bereits als nackten Gitlink-Eintrag hinzugefügt hätten) würden Sie einfach Folgendes verwenden git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Wie Sie festgestellt haben, funktioniert dies nicht, wenn der Pfad bereits im Index vorhanden ist. Die Lösung besteht darin, den Gitlink-Eintrag vorübergehend aus dem Index zu entfernen und dann das Submodul hinzuzufügen:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Dadurch wird Ihr vorhandenes Sub-Repository verwendet (dh das Quell-Repository wird nicht neu geklont) und eine .gitmodules
Datei bereitgestellt, die folgendermaßen aussieht:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Es wird auch ein ähnlicher Eintrag in Ihrem Haupt-Repository vorgenommen .git/config
(ohne die path
Einstellung).
Wenn Sie dies festlegen, erhalten Sie ein geeignetes Submodul. Wenn Sie das Repository klonen (oder auf GitHub pushen und von dort klonen), sollten Sie in der Lage sein, das Submodul über neu zu initialisieren git submodule update --init
.
Ersetzen Sie es durch einfachen Inhalt
Im nächsten Schritt wird davon ausgegangen, dass Ihr Sub-Repository in vendor/plugins/open_flash_chart_2
keinen lokalen Verlauf hat, den Sie beibehalten möchten (dh alles, was Sie interessiert, ist der aktuelle Arbeitsbaum des Unter-Repositorys, nicht der Verlauf).
Wenn Sie einen lokalen Verlauf im Sub-Repository haben, den Sie interessieren, sollten Sie das .git
Verzeichnis des Sub-Repositorys sichern, bevor Sie es im zweiten Befehl unten löschen. ( Beachten Sie auch das folgende Beispiel für einen Git-Teilbaum , in dem der Verlauf des HEAD des Sub-Repositorys beibehalten wird.)
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Dieses Mal ist das Verzeichnis beim Hinzufügen kein Unter-Repository, daher werden die Dateien normal hinzugefügt. Da wir das .git
Verzeichnis gelöscht haben, gibt es leider keine einfache Möglichkeit, die Dinge mit dem Quell-Repository auf dem neuesten Stand zu halten.
Sie können stattdessen eine Teilbaumzusammenführung verwenden. Auf diese Weise können Sie problemlos Änderungen aus dem Quell-Repository übernehmen und gleichzeitig die Dateien in Ihrem Repository "flach" halten (keine Submodule). Der Befehl git subtree eines Drittanbieters ist ein netter Wrapper um die Funktion zum Zusammenführen von Teilbäumen.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Später:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
Der Git-Teilbaum verfügt auch über eine --squash
Option, mit der Sie vermeiden können, den Verlauf des Quell-Repositorys in Ihren Verlauf aufzunehmen, aber dennoch Upstream-Änderungen übernehmen können.