it-swarm.com.de

Problem beim Hinzufügen von allgemeinem Code als git-Submodul: "Bereits im Index vorhanden"

Ich bin neu bei git und würde mich über Hilfe beim Hinzufügen von Submodulen freuen. Der freigegebene Code wurde einfach in die beiden Projekte kopiert. Ich erstellte ein separates Git-Repo für den allgemeinen Code und entfernte es aus den Projekten 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

bekam aber dann den 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 dort hinzuzufügen, nicht jedoch im Projektordner. Das Problem ist, dass es wirklich im Projektordner sein muss ... Was kann ich dagegen tun und was habe ich missverstanden mit der Pfadoption von git submodule add?

170
Vanja

Ich fürchte, in Ihrer Frage gibt es nicht genügend Informationen, um sicher zu sein, was los ist, da Sie auf meine Folgefrage nicht geantwortet haben, aber dies kann auf jeden Fall hilfreich sein.

Dieser Fehler bedeutet, dass projectfolder bereits bereitgestellt ist ("ist bereits im Index vorhanden"). Um herauszufinden, was hier vor sich geht, versuchen Sie, alles im Index unter diesem Ordner aufzulisten:

git ls-files --stage projectfolder

In der ersten Spalte dieser Ausgabe erfahren Sie, welcher Objekttyp im Index bei projectfolder enthalten ist. (Diese sehen aus wie Unix-Dateimodi, haben aber in git eine besondere Bedeutung.)

Ich vermute, dass Sie so etwas sehen werden:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(d. h. eine mit 160000 beginnende Zeile). In diesem Fall wurde das Repository in projectfolder bereits als "gitlink" hinzugefügt. Wenn es nicht in der Ausgabe von git submodule angezeigt wird und Sie es als Submodul erneut hinzufügen möchten, können Sie Folgendes tun:

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 werden (mit den Dateimodi 100644 und 100755), was darauf schließen lässt, dass Sie die Dateien in projectfolder nicht ordnungsgemäß entpackt haben, bevor Sie das neue Repository in Position kopieren. Wenn dies der Fall ist, können Sie alle diese Dateien aufheben:

git rm -r --cached projectfolder

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

git submodule add url_to_repo projectfolder
285
Mark Longair

Das manuelle Entfernen des Submoduls beinhaltet eine Anzahl von Schritten, und das hat für mich funktioniert.

Angenommen, Sie befinden sich im Projektstammverzeichnis und der Name des Beispielgit-Moduls lautet "c3-pro-ios-framework".

Entfernen Sie die dem Submodul zugeordneten Dateien.

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

Entferne alle Verweise auf Submodule in config

vim .git/config

 enter image description here

.Gitmodules entfernen

rm -rf .gitmodules

Entferne es aus dem Cache ohne "git"

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

Submodul hinzufügen

git submodule add https://github.com/chb/c3-pro-ios-framework.git
35
Gajen Sunthara

Ich hatte das gleiche Problem und fand nach Stunden des Suchens 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 ist, das Verzeichnis, in dem sich das Submodul befindet, NICHT zu erstellen. Das Verzeichnis wird als Teil des Befehls git submodule add erstellt. 

Es wird außerdem erwartet, dass das Argument relativ zum übergeordneten Repo-Stamm ist, nicht zum Arbeitsverzeichnis. Achten Sie darauf. 

Lösung für das obige Beispiel:

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

Ich hoffe, das hilft jemandem, da es an anderer Stelle kaum Informationen darüber gibt.

31
Shelton

wenn unter git control ein Ordner mit dem Namen x vorhanden ist, möchten Sie ein Submodul mit demselben Namen hinzufügen. Sie sollten den Ordner x löschen und ihn zuerst festlegen .

Aktualisiert von @ ujjwal-singh:

Commit wird nicht benötigt, Staging genügt. git add/git rm -r

14
justbilt

Sie müssen zunächst Ihr Submodul-Git-Repository (in diesem Fall Projektordner) für git path entfernen. 

rm -rf projectfolder

git rm -r projectfolder

und fügen Sie dann ein Submodul hinzu

git submodule add <git_submodule_repository> projectfolder
14
Neeraj Kumar

Nur um in der menschlichen Sprache zu klären, was der Fehler Ihnen zu sagen versucht:

In diesem Ordner können Sie kein Repository erstellen, das bereits im Haupt-Repository verfolgt wurde.

Beispiel: Sie haben einen Themenordner mit dem Namen AwesomeTheme, der ein dediziertes Repository ist. Versuchen Sie, ihn direkt in Ihr Haupt-Repository wie git submodule add sites/themes abzulegen, und Sie erhalten diesen "AwesomeTheme" index already exists.

Sie müssen lediglich sicherstellen, dass sich im Versions-Tracking des Haupt-Repositorys noch kein sites/themes/AwesomeTheme befindet, sodass das Submodul dort erstellt werden kann.

Wenn Sie ein leeres sites/theme/AwesomeTheme-Verzeichnis haben, entfernen Sie es in Ihrem Haupt-Repository. Wenn Sie mit dem Verzeichnis sites/theme/AwesomeTheme in Ihrem Haupt-Repository bereits Commits gemacht haben, müssen Sie die gesamte Historie mit einem Befehl wie diesem löschen:

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

Jetzt können Sie git submodule add [email protected] sites/themes/AwesomeTheme ausführen.

Da das Haupt-Repository in sites/themes/AwesomeTheme noch nie etwas (a.k.a index'd) gesehen hat, kann es jetzt erstellt werden.

2
Dylan Pierce

Ich habe es funktioniert, indem ich es umgekehrt gemacht habe. Beginnen Sie mit einem leeren Repo und fügen Sie das Submodul in einem neuen Ordner mit dem Namen "Projektordner/Allgemeiner Code" hinzu. Danach konnte der Projektcode im Projektordner hinzugefügt werden. Die Details werden 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 zum Projektordner hinzugefügt werden.

Ich kann noch nicht sagen, warum es so funktioniert hat und nicht der andere.

1
Vanja

Ich weiß nicht, ob dies nützlich ist, obwohl ich das gleiche Problem hatte, als ich versuchte, meine Dateien von IntelliJ 15 aus festzuschreiben. Am Ende habe ich SourceTree geöffnet und dort konnte ich die Datei einfach übergeben. Problem gelöst. Es müssen keine ausgefallenen Git-Befehle ausgegeben werden. Erwähnen Sie es einfach, falls jemand das gleiche Problem hat.

0
Lawrence

Wechseln Sie in den Repository-Ordner. Löschen Sie relevante Submodule aus .gitmodules. Wählen Sie Versteckte Dateien anzeigen. Gehe in den Git-Ordner, lösche die Submodule aus dem Modul-Ordner und der Konfiguration.

0
Sam Biswas