Ich bin neu in Git und würde mich über Hilfe beim Hinzufügen von Submodulen freuen. Ich habe zwei Projekte erhalten, die einen gemeinsamen Code teilen. Der gemeinsam genutzte Code wurde gerade in die beiden Projekte kopiert. Ich habe ein separates Git-Repo für den allgemeinen Code erstellt und es aus den Projekten entfernt, mit dem Plan, es als Git-Submodul hinzuzufügen.
Ich habe die Pfadoption von git submodule add verwendet, um den Ordner anzugeben:
git submodule add url_to_repo projectfolder
aber dann bekam der Fehler:
'projectfolder' already exists in the index"
Dies ist die gewünschte Struktur meines Repositorys:
repo
|-- projectfolder
|-- folder with common code
Es ist möglich, das Git-Submodul direkt im Repo oder in einem neuen Ordner hinzuzufügen, jedoch nicht im Projektordner. Das Problem ist, dass es wirklich im Projektordner sein muss. Was kann ich dagegen tun und was habe ich über die Pfadoption von git submodule add falsch verstanden?
quelle
git ls-files --stage projectfolder
?git rm
geholfen , einen auf dem vorhandenen Ordner zu machen: |Antworten:
Ich fürchte, Ihre Frage enthält nicht genügend Informationen, um sicher zu sein, was los ist, da Sie meine Folgefrage nicht beantwortet haben, aber dies kann auf jeden Fall hilfreich sein.
Dieser Fehler bedeutet, dass er
projectfolder
bereits inszeniert ist ("existiert bereits im Index"). Um herauszufinden, was hier vor sich geht, versuchen Sie, alles im Index unter diesem Ordner aufzulisten mit:In der ersten Spalte dieser Ausgabe erfahren Sie, welcher Objekttyp im Index unter enthalten ist
projectfolder
. (Diese sehen aus wie Unix-Dateimodi, haben aber in git eine besondere Bedeutung.)Ich vermute, dass Sie so etwas sehen werden wie:
(dh eine Zeile beginnend mit
160000
). In diesem Fall wurde das Repository inprojectfolder
bereits als "Gitlink" hinzugefügt. Wenn es nicht in der Ausgabe von angezeigtgit submodule
wird und Sie es erneut als Submodul hinzufügen möchten, haben Sie folgende Möglichkeiten:... um es zu inszenieren und dann:
... um das Repository als Submodul hinzuzufügen.
Es ist jedoch auch möglich, dass viele Blobs aufgelistet sind (mit Dateimodi
100644
und100755
), was darauf hindeutet, dass Sie die Dateienprojectfolder
vor dem Kopieren des neuen Repositorys nicht ordnungsgemäß entfernt haben. In diesem Fall können Sie die folgenden Schritte ausführen, um alle diese Dateien zu entfernen:... und fügen Sie dann das Submodul hinzu mit:
quelle
projectfolder
kein.git
Verzeichnis enthalten war . Aus Ihrer Frage ging hervor, als hätten Sie das neue Repository für eineprojectfolder
andere Stelle erstellt und an Ort und Stelle kopiert, aber das war eindeutig nicht der Fall. Sie müssen das vorhandeneprojectfolder
Repository aus dem Weg räumen und dann das neue Repository (einschließlich des.git
Verzeichnisses) kopieren, bevor Sie es als Submodul hinzufügen. Wenn Sie es bereits in das von dargestellte Repositoryurl_to_repo
verschobenprojectfolder
haben , können Sie es einfach aus dem Weg räumen und dann das Submodul von dieser URL hinzufügen.Das manuelle Entfernen des Submoduls umfasst mehrere Schritte, und dies hat bei mir funktioniert.
Angenommen, Sie befinden sich im Projektstammverzeichnis und der Name des Beispiel-Git-Moduls lautet "c3-pro-ios-framework".
Entfernen Sie die dem Submodul zugeordneten Dateien
Entfernen Sie alle Verweise auf das Submodul in der Konfiguration
Entfernen Sie .gitmodules
Entfernen Sie es aus dem Cache ohne das "Git"
Submodul hinzufügen
quelle
git submodule
nach dem Entfernen und vor dem Hinzufügen aufzulisten, und es gab mir einen Fehler, das Festlegen des Entfernens hat sich darum gekümmert.touch .gitmodules
(Muss sich im Arbeitsbaum befinden, daher hilft es, ihn zu entfernen. Sie müssen ihn jedoch wieder hinzufügen.) Super Beitrag übrigens. Das einzige, was hier funktioniert hat..git
Verzeichnis, das noch Überreste für mich hatte. Das hat super geklappt. Danke dir.Sie müssen zuerst Ihr Submodul-Git-Repository (in diesem Fall den Projektordner) für den Git-Pfad entfernen.
und dann Submodul hinzufügen
quelle
git submodule add --force <git_submodule_repository>
arbeitete für mich, um den gleichen Submodulnamen zu behaltenIch hatte das gleiche Problem und fand nach stundenlangem Suchen die Antwort.
Der Fehler, den ich bekam, war etwas anders:
<path> already exists and is not a valid git repo
(und hier für den SEO-Wert hinzugefügt)Die Lösung besteht darin, NICHT das Verzeichnis zu erstellen, in dem sich das Submodul befindet. Das Verzeichnis wird als Teil des
git submodule add
Befehls erstellt.Außerdem wird erwartet, dass das Argument relativ zum übergeordneten Repo-Stammverzeichnis und nicht zu Ihrem Arbeitsverzeichnis ist. Achten Sie also darauf.
Lösung für das obige Beispiel:
common_code
Verzeichnis nicht vorhanden ist.cd Repo
git submodule add git://url_to_repo projectfolder/common_code/
( Beachten Sie den erforderlichen Schrägstrich. )Ich hoffe, das hilft jemandem, da es anderswo nur sehr wenige Informationen darüber gibt.
quelle
git submodule add
und der abschließende Schrägstrich ist nicht erforderlich.Wenn ein Ordner mit dem Namen
x
git control vorhanden ist und Sie ein Submodul mit demselben Namen hinzufügen möchten, sollten Sie den Ordner löschenx
und zuerst festschreiben .Aktualisiert von @ ujjwal-singh:
Commit ist nicht erforderlich, Staging reicht aus.
git add
/git rm -r
quelle
git add
/gir rm -r
Nur um in menschlicher Sprache zu klären, was der Fehler Ihnen zu sagen versucht:
Sie können in diesem Ordner kein Repository erstellen, das bereits im Hauptrepository verfolgt wird.
Beispiel: Sie haben einen Themenordner mit dem Namen
AwesomeTheme
"dediziertes Repository". Versuchen Sie, ihn direkt in Ihr Haupt-Repository zu kopieren,git submodule add sites/themes
und Sie erhalten diesen"AwesomeTheme" index already exists
.Sie müssen nur sicherstellen, dass
sites/themes/AwesomeTheme
in der Versionsverfolgung des Hauptrepositorys noch keine vorhanden ist , damit das Submodul dort erstellt werden kann.sites/theme/AwesomeTheme
Um dies zu beheben, entfernen Sie es in Ihrem Haupt-Repository, wenn Sie ein leeres Verzeichnis haben. Wenn Sie bereits Commits mit demsites/theme/AwesomeTheme
Verzeichnis in Ihrem Haupt-Repository vorgenommen haben, müssen Sie den gesamten Verlauf mit einem Befehl wie dem folgenden löschen:Jetzt kannst du rennen
git submodule add [email protected] sites/themes/AwesomeTheme
Da das Haupt-Repository noch nie etwas (auch bekannt als index'd) gesehen hat
sites/themes/AwesomeTheme
, kann es es jetzt erstellen.quelle
Ich habe es funktioniert, indem ich es umgekehrt gemacht habe. Beginnen Sie mit einem leeren Repo und fügen Sie das Submodul in einen neuen Ordner mit dem Namen "projectfolder / common_code" ein. Danach konnte der Projektcode im Projektordner hinzugefügt werden. Die Details sind unten gezeigt.
In einem leeren Repo-Typ:
Dadurch wird die gewünschte Ordnerstruktur erstellt:
Es ist jetzt möglich, weitere Submodule hinzuzufügen, und der Projektcode kann dem Projektordner hinzugefügt werden.
Ich kann noch nicht sagen, warum es so funktioniert hat und nicht das andere.
quelle
Ich weiß nicht, ob dies nützlich ist, obwohl ich das gleiche Problem hatte, als ich versuchte, meine Dateien in IntelliJ 15 festzuschreiben. Am Ende habe ich SourceTree geöffnet und dort konnte ich die Datei einfach festschreiben. Problem gelöst. Sie müssen keine ausgefallenen Git-Befehle ausgeben. Ich erwähne es nur, falls jemand das gleiche Problem hat.
quelle
Wechseln Sie in den Repository-Ordner. Löschen Sie relevante Submodule aus .gitmodules. Wählen Sie Versteckte Dateien anzeigen. Gehen Sie zum Ordner .git, löschen Sie die Submodule aus dem Modulordner und konfigurieren Sie.
quelle
Dies geschieht, wenn die .git-Datei im Zielpfad fehlt. Es passierte mir, nachdem ich hingerichtet hatte
git clean -f -d
.Ich musste alle in der Nachricht angezeigten Zielordner löschen und dann ausführen
git submodule update --remote
quelle
Angenommen, Sie haben in Ihrem Git-Verzeichnis alle Änderungen synchronisiert.
Dann mach:
quelle