Problème avec l'ajout de code commun comme sous-module git: "existe déjà dans l'index"


226

Je suis nouveau sur git et j'aimerais avoir de l'aide pour ajouter des sous-modules. J'ai reçu deux projets partageant un code commun. Le code partagé vient d'être copié dans les deux projets. J'ai créé un dépôt git séparé pour le code commun et je l'ai supprimé des projets avec le plan pour l'ajouter en tant que sous-module git.

J'ai utilisé l'option path de git submodule add pour spécifier le dossier:

git submodule add url_to_repo projectfolder

mais a ensuite obtenu l'erreur:

'projectfolder' already exists in the index"

Voici la structure souhaitée de mon référentiel:

repo
|-- projectfolder
    |-- folder with common code

Il est possible d'ajouter le sous-module git directement dans le repo ou dans un nouveau dossier, mais pas dans le dossier du projet. Le problème est qu'il doit vraiment se trouver dans le dossier du projet.


Qu'obtenez-vous si vous le faites git ls-files --stage projectfolder?
Mark Longair

Je reçois une liste avec tout le contenu commençant par 100644.
Vanja


8
pour moi, faire un git rmsur le dossier existant a aidé: |
rogerdpack

Réponses:


343

Je crains qu'il n'y ait pas suffisamment d'informations dans votre question pour être certain de ce qui se passe, puisque vous n'avez pas répondu à ma question de suivi, mais cela peut être utile dans tous les cas.

Cette erreur signifie qu'elle projectfolderest déjà mise en scène ("existe déjà dans l'index"). Pour savoir ce qui se passe ici, essayez de répertorier tout dans l'index sous ce dossier avec:

git ls-files --stage projectfolder

La première colonne de cette sortie vous indiquera quel type d'objet se trouve dans l'index à projectfolder. (Ils ressemblent aux modes de fichiers Unix, mais ont des significations spéciales dans git.)

Je soupçonne que vous verrez quelque chose comme:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(c'est-à-dire une ligne commençant par 160000), auquel cas le référentiel dans projectfoldera déjà été ajouté en tant que "gitlink". S'il n'apparaît pas dans la sortie de git submoduleet que vous souhaitez l'ajouter à nouveau en tant que sous-module, vous pouvez effectuer:

git rm --cached projectfolder

... pour le déchaîner, puis:

git submodule add url_to_repo projectfolder

... pour ajouter le référentiel en tant que sous-module.

Cependant, il est également possible que de nombreux objets blob soient répertoriés (avec les modes de fichier 100644et 100755), ce qui me suggérerait que vous n'avez pas correctement mis en scène les fichiers projectfolderavant de copier le nouveau référentiel en place. Si tel est le cas, vous pouvez procéder comme suit pour supprimer tous ces fichiers:

git rm -r --cached projectfolder

... puis ajoutez le sous-module avec:

git submodule add url_to_repo projectfolder

13
Merci Mark pour votre réponse détaillée. J'ai fait un "dossier de projet git rm -r --cached" et j'ai essayé à nouveau d'accéder au sous-module. Cependant, cette fois, je reçois l'erreur rmessage "'projectfolder' existe déjà et n'est pas un dépôt git valide".
Vanja

3
@ Vanja: Cela indique qu'il projectfolderne contient pas de .gitrépertoire. Cela sonnait à votre question comme si vous aviez créé le nouveau référentiel pour projectfolderailleurs et l' aviez copié en place, mais ce n'était clairement pas le cas. Vous devez déplacer l'existant projectfolder, puis copier le nouveau référentiel (complet avec son .gitrépertoire) en place avant de l'ajouter en tant que sous-module. Ou, si vous l'avez déjà poussé vers le référentiel représenté par url_to_repo, vous pouvez simplement vous projectfolderéloigner, puis ajouter le sous-module à partir de cette URL.
Mark Longair

réponse impressionnante +1 tout le long
abbood

Cela m'a beaucoup aidé. Je vous remercie!
Evan Moran

1
C'est ce que j'ai fait, qui est un processus en 3 étapes ÉTAPE 1: git rm -r --cached src / test / resources /, ÉTAPE 2: suppression du répertoire des ressources existant à un autre endroit, ÉTAPE 3: git submodule add add url_to_repo src / test / ressources
vikramvi

52

La suppression manuelle du sous-module implique un certain nombre d'étapes et cela a fonctionné pour moi.

En supposant que vous vous trouviez dans le répertoire racine du projet et que l'exemple de nom de module git soit "c3-pro-ios-framework"

Supprimez les fichiers associés au sous-module

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

Supprimez toutes les références au sous-module dans la configuration

vim .git/config

entrez la description de l'image ici

Supprimer les .gitmodules

rm -rf .gitmodules

Retirez-le du cache sans le "git"

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

Ajouter un sous-module

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

2
Excellent post, fonctionne très bien. Super de le partager, monsieur. Vraiment super.
gabn88

1
J'ai essayé de répertorier les sous-modules via git submoduleaprès la suppression et avant d'ajouter et cela m'a donné une erreur, en validant la suppression, j'ai pris soin de cela.
mehmet

1
Je voterais pour ce 50x si je le pouvais; vous venez de sauver ma journée!
Sensei James

touch .gitmodules(doit être dans l'arborescence de travail, donc le supprimer aide. Mais vous devez l'ajouter à nouveau). Génial après btw. La seule chose qui a fonctionné ici.
Torxed

C'était le .gitrépertoire qui avait encore des restes pour moi. Cela a très bien fonctionné. Je vous remercie.
Kevin Anderson

45

Vous devez d'abord supprimer votre référentiel git de sous-module (dossier de projet dans ce cas) pour le chemin git.

rm -rf projectfolder

git rm -r projectfolder

puis ajouter un sous-module

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>travaillé pour moi pour garder le même nom de sous-module
Tenfrow

1
Merci!! Je n'ai pas eu à ajouter dans le dossier du projet, je viens de changer dans le sous-répertoire et les clones à partir de là.
Tony Fraser

32

J'ai eu le même problème et après des heures de recherche, j'ai trouvé la réponse.

L'erreur que j'obtenais était un peu différente: <path> already exists and is not a valid git repo(et ajoutée ici pour la valeur SEO)

La solution est de NE PAS créer le répertoire qui abritera le sous-module. Le répertoire sera créé dans le cadre de la git submodule addcommande.

En outre, l'argument devrait être relatif à la racine du référentiel parent, et non à votre répertoire de travail, alors faites attention à cela.

Solution pour l'exemple ci-dessus:

  1. Il est normal que votre dépôt parent soit déjà cloné.
  2. Assurez-vous que le common_coderépertoire n'existe pas .
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Notez la barre oblique de fin requise. )
  5. Santé mentale restaurée.

J'espère que cela aide quelqu'un, car il y a très peu d'informations à ce sujet ailleurs.


1
L'étape 4 doit commencer git submodule addet la barre oblique de fin n'est pas requise.
nullité

Correction de la faute de frappe. Je l'ai testé à nouveau et la barre oblique de fin a fait une différence pour moi. J'utilise zsh si cela a un effet.
non défini

Cela a résolu mon problème (création du répertoire avec la commande add submodule), merci!
jackJoe

18

s'il existe un dossier nommé xsous git control, vous voulez ajouter un sous-module du même nom, vous devez supprimer le dossier xet le valider en premier .

Mis à jour par @ ujjwal-singh:

L'engagement n'est pas nécessaire, la mise en scène suffit .. git add/git rm -r


L'engagement était ce que j'ai manqué. Réponse courte, mais correcte!
Qqwy

3
L'engagement n'est pas nécessaire, la mise en scène suffit .. git add/gir rm -r
Ujjwal Singh

3

Juste pour clarifier en langage humain ce que l'erreur essaie de vous dire:

Vous ne pouvez pas créer un référentiel dans ce dossier qui a déjà été suivi dans le référentiel principal.

Par exemple: Vous avez un dossier de thème appelé AwesomeThemec'est un référentiel dédié, vous essayez de le vider directement dans votre référentiel principal comme git submodule add sites/themeset vous obtenez ceci "AwesomeTheme" index already exists.

Vous devez juste vous assurer qu'il n'y a pas déjà sites/themes/AwesomeThemede suivi de version dans le référentiel principal pour que le sous-module puisse y être créé.

Donc, pour corriger, dans votre référentiel principal si vous avez un sites/theme/AwesomeThemerépertoire vide , supprimez-le. Si vous avez déjà effectué des validations avec le sites/theme/AwesomeThemerépertoire de votre référentiel principal, vous devez en purger tout l'historique avec une commande comme celle-ci:

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

Vous pouvez maintenant exécuter git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Comme le référentiel principal n'a jamais rien vu (aka indexé) sites/themes/AwesomeThemeauparavant, il peut maintenant le créer.


1

Je l'ai fait fonctionner en le faisant dans l'autre sens. En commençant par un dépôt vide, en ajoutant le sous-module dans un nouveau dossier appelé "projectfolder / common_code". Après cela, il a été possible d'ajouter le code du projet dans le dossier du projet. Les détails sont indiqués ci-dessous.

Dans un type de référentiel vide:

git submodule add url_to_repo projectfolder/common_code

Cela créera la structure de dossiers souhaitée:

repo
|-- projectfolder
    |-- common_code

Il est désormais possible d'ajouter d'autres sous-modules et le code du projet peut être ajouté au dossier du projet.

Je ne peux pas encore dire pourquoi cela a fonctionné de cette façon et pas l'autre.


0

Je ne sais pas si cela est utile, bien que j'aie eu le même problème lorsque j'essayais de valider mes fichiers depuis IntelliJ 15. En fin de compte, j'ai ouvert SourceTree et là-dedans, je pouvais simplement valider le fichier. Problème résolu. Pas besoin d'émettre de commandes git fantaisistes. Il suffit de le mentionner au cas où quelqu'un aurait le même problème.


0

Accédez au dossier du référentiel. Supprimez les sous-modules concernés de .gitmodules. Sélectionnez afficher les fichiers cachés. Accédez au dossier .git, supprimez les sous-modules du dossier du module et configurez.


0

Cela se produit si le fichier .git est manquant dans le chemin cible. Cela m'est arrivé après avoir exécuté git clean -f -d.

J'ai dû supprimer tous les dossiers cibles affichés dans le message, puis exécuter git submodule update --remote


-18

Dans votre répertoire git, supposons que vous ayez synchronisé toutes les modifications.

rm -rf .git 

rm -rf .gitmodules

Alors fais:

git init
git submodule add url_to_repo projectfolder

2
cela supprimera toute l'histoire du projet!
redbandit
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.