Problem beim Hinzufügen von allgemeinem Code als Git-Submodul: "existiert bereits im Index"

225

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?

Vanja
quelle
Was bekommen Sie, wenn Sie das tun git ls-files --stage projectfolder?
Mark Longair
Ich bekomme eine Liste mit allen Inhalten ab 100644.
Vanja
8
Für mich hat es git rmgeholfen , einen auf dem vorhandenen Ordner zu machen: |
Rogerdpack

Antworten:

343

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 projectfolderbereits inszeniert ist ("existiert bereits im Index"). Um herauszufinden, was hier vor sich geht, versuchen Sie, alles im Index unter diesem Ordner aufzulisten mit:

git ls-files --stage projectfolder

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:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(dh eine Zeile beginnend mit 160000). In diesem Fall wurde das Repository in projectfolderbereits als "Gitlink" hinzugefügt. Wenn es nicht in der Ausgabe von angezeigt git submodulewird und Sie es erneut als Submodul hinzufügen möchten, haben Sie folgende Möglichkeiten:

git rm --cached projectfolder

... um es zu inszenieren und dann:

git submodule add url_to_repo projectfolder

... um das Repository als Submodul hinzuzufügen.

Es ist jedoch auch möglich, dass viele Blobs aufgelistet sind (mit Dateimodi 100644und 100755), was darauf hindeutet, dass Sie die Dateien projectfoldervor 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:

git rm -r --cached projectfolder

... und fügen Sie dann das Submodul hinzu mit:

git submodule add url_to_repo projectfolder
Mark Longair
quelle
12
Vielen Dank an Mark für Ihre ausführliche Antwort. Ich habe einen "git rm -r --cached projectfolder" erstellt und versucht, das Submodul erneut aufzurufen. Diesmal erhalte ich jedoch den Fehler rmessage "'Projektordner' existiert bereits und ist kein gültiges Git-Repo".
Vanja
3
@ Vanja: Das zeigt an, dass projectfolderkein .gitVerzeichnis enthalten war . Aus Ihrer Frage ging hervor, als hätten Sie das neue Repository für eine projectfolderandere Stelle erstellt und an Ort und Stelle kopiert, aber das war eindeutig nicht der Fall. Sie müssen das vorhandene projectfolderRepository aus dem Weg räumen und dann das neue Repository (einschließlich des .gitVerzeichnisses) kopieren, bevor Sie es als Submodul hinzufügen. Wenn Sie es bereits in das von dargestellte Repository url_to_repoverschoben projectfolderhaben , können Sie es einfach aus dem Weg räumen und dann das Submodul von dieser URL hinzufügen.
Mark Longair
tolle Antwort +1 den ganzen Weg
Abbood
Das hat mir sehr geholfen. Danke dir!
Evan Moran
1
Dies ist, was ich getan habe, was ein dreistufiger Prozess ist. SCHRITT 1: git rm -r --cached src / test / resources /, SCHRITT 2: Vorhandenes Ressourcenverzeichnis an einen anderen Ort entfernt. Test / Ressourcen
Vikramvi
52

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

rm -rf .git/modules/c3-pro-ios-framework/

Entfernen Sie alle Verweise auf das Submodul in der Konfiguration

vim .git/config

Geben Sie hier die Bildbeschreibung ein

Entfernen Sie .gitmodules

rm -rf .gitmodules

Entfernen Sie es aus dem Cache ohne das "Git"

git rm --cached c3-pro-ios-framework

Submodul hinzufügen

git submodule add https://github.com/chb/c3-pro-ios-framework.git
Gajen Sunthara
quelle
2
Toller Beitrag, funktioniert super. Schön, dass Sie es teilen, Sir. Echt super.
gabn88
1
Ich habe versucht, Submodule über git submodulenach dem Entfernen und vor dem Hinzufügen aufzulisten, und es gab mir einen Fehler, das Festlegen des Entfernens hat sich darum gekümmert.
Mehmet
1
Ich würde dieses 50x positiv bewerten, wenn ich könnte; Du hast gerade meinen Tag gerettet!
Sensei James
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.
Torxed
Es war das .gitVerzeichnis, das noch Überreste für mich hatte. Das hat super geklappt. Danke dir.
Kevin Anderson
44

Sie müssen zuerst Ihr Submodul-Git-Repository (in diesem Fall den Projektordner) für den Git-Pfad entfernen.

rm -rf projectfolder

git rm -r projectfolder

und dann Submodul hinzufügen

git submodule add <git_submodule_repository> projectfolder
Neeraj Kumar
quelle
4
git submodule add --force <git_submodule_repository>arbeitete für mich, um den gleichen Submodulnamen zu behalten
Tenfrow
1
Vielen Dank!! Ich musste nicht in den Projektordner hinzufügen, sondern nur in das Unterverzeichnis wechseln und von dort klonen.
Tony Fraser
32

Ich 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 addBefehls 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:

  1. Es ist in Ordnung, wenn Ihr Eltern-Repo bereits geklont ist.
  2. Stellen Sie sicher, dass das common_codeVerzeichnis nicht vorhanden ist.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Beachten Sie den erforderlichen Schrägstrich. )
  5. Vernunft wiederhergestellt.

Ich hoffe, das hilft jemandem, da es anderswo nur sehr wenige Informationen darüber gibt.

nicht definiert
quelle
1
Schritt 4 sollte beginnen git submodule addund der abschließende Schrägstrich ist nicht erforderlich.
Nichtigkeit
Tippfehler behoben. Ich habe es erneut getestet und der nachgestellte Schrägstrich hat einen Unterschied für mich gemacht. Ich benutze zsh, wenn das irgendeinen Effekt hat.
undefiniert
Dies löste mein Problem (Erstellen des Verzeichnisses mit dem Befehl add submodule), danke!
JackJoe
18

Wenn ein Ordner mit dem Namen xgit control vorhanden ist und Sie ein Submodul mit demselben Namen hinzufügen möchten, sollten Sie den Ordner löschen xund zuerst festschreiben .

Aktualisiert von @ ujjwal-singh:

Commit ist nicht erforderlich, Staging reicht aus. git add/git rm -r

justbilt
quelle
Das Festschreiben war das, was ich vermisst habe. Kurze Antwort, aber richtig!
Qqwy
3
Commit ist nicht erforderlich, Inszenierung reicht aus. git add/gir rm -r
Ujjwal Singh
3

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/themesund Sie erhalten diesen "AwesomeTheme" index already exists.

Sie müssen nur sicherstellen, dass sites/themes/AwesomeThemein der Versionsverfolgung des Hauptrepositorys noch keine vorhanden ist , damit das Submodul dort erstellt werden kann.

sites/theme/AwesomeThemeUm dies zu beheben, entfernen Sie es in Ihrem Haupt-Repository, wenn Sie ein leeres Verzeichnis haben. Wenn Sie bereits Commits mit dem sites/theme/AwesomeThemeVerzeichnis in Ihrem Haupt-Repository vorgenommen haben, müssen Sie den gesamten Verlauf mit einem Befehl wie dem folgenden löschen:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

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.

Dylan Pierce
quelle
1

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:

git submodule add url_to_repo projectfolder/common_code

Dadurch wird die gewünschte Ordnerstruktur erstellt:

repo
|-- projectfolder
    |-- common_code

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.

Vanja
quelle
0

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.

Lawrence
quelle
0

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.

Sam Biswas
quelle
0

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

Schwarz
quelle
-18

Angenommen, Sie haben in Ihrem Git-Verzeichnis alle Änderungen synchronisiert.

rm -rf .git 

rm -rf .gitmodules

Dann mach:

git init
git submodule add url_to_repo projectfolder
seektrue
quelle
2
Dadurch wird der gesamte Projektverlauf gelöscht!
Redbandit