Problème avec l’ajout de code commun en tant que sous-module git: «existe déjà dans l’index»

Je suis nouveau à git et apprécierais l’aide avec l’ajout de 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 repository git distinct pour le code commun et l’ai retiré des projets avec le projet de l’append en tant que sous-module git.

J’ai utilisé l’option path du sous-module git add pour spécifier le dossier:

git submodule add url_to_repo projectfolder 

mais alors eu l’erreur:

 'projectfolder' already exists in the index" 

Ceci est la structure souhaitée de mon référentiel:

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

Il est possible d’append le sous-module git directement dans le repository ou dans un nouveau dossier, mais pas dans le dossier du projet. Le problème est qu’il doit vraiment être dans le dossier du projet. Que puis-je faire à ce sujet et qu’est-ce que j’ai mal compris concernant l’option de chemin d’access du sous-module git add?

Je crains que votre question ne contienne pas suffisamment d’informations pour être certain de ce qui se passe, puisque vous n’avez pas répondu à ma question de suivi, mais cela pourrait être utile dans tous les cas.

Cette erreur signifie que le projectfolder est déjà mis en scène (“existe déjà dans l’index”). Pour savoir ce qui se passe ici, essayez de répertorier tout ce qui se trouve dans l’index sous ce dossier avec:

 git ls-files --stage projectfolder 

La première colonne de cette sortie vous indiquera quel type d’object se trouve dans l’index du projectfolder . (Celles-ci ressemblent à des fichiers-noms Unix, mais ont des significations spéciales dans git.)

Je pense 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 du projectfolder de projectfolder a déjà été ajouté en tant que “gitlink”. Si elle n’apparaît pas dans la sortie du git submodulegit submodule et que vous souhaitez la rappend en tant que sous-module, vous pouvez:

 git rm --cached projectfolder 

… pour le décoller, puis:

 git submodule add url_to_repo projectfolder 

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

Cependant, il est également possible que vous voyiez de nombreux blobs listés (avec les modes de fichiers 100644 et 100755 ), ce qui me suggérerait que vous n’avez pas décompacté correctement les fichiers dans le dossier de projectfolder avant de copier le nouveau référentiel. Si tel est le cas, vous pouvez procéder comme suit pour désinstaller tous ces fichiers:

 git rm -r --cached projectfolder 

… puis ajoutez le sous-module avec:

 git submodule add url_to_repo projectfolder 

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

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

La solution consiste à ne PAS créer le répertoire qui hébergera le sous-module. Le répertoire sera créé dans le cadre de la commande git submodule add .

En outre, l’argument est censé être relatif à la racine de repo parent, pas à votre répertoire de travail, alors faites attention à cela.

Solution pour l’exemple ci-dessus:

  1. Il est correct que votre repo parent soit déjà cloné.
  2. Assurez-vous que le répertoire common_code n’existe pas .
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/ ( Notez la barre oblique git submodule add git://url_to_repo projectfolder/common_code/ requirejse. )
  5. Sanity restauré.

J’espère que cela aide quelqu’un, car il existe très peu d’informations à ce sujet.

La suppression manuelle du sous-module implique plusieurs étapes et cela a fonctionné pour moi.

En supposant que vous êtes dans le répertoire racine du projet et que le nom du module git exemple est “c3-pro-ios-framework”

Supprimer les fichiers associés au sous-module

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

Supprimer toutes les références au sous-module dans config

 vim .git/config 

entrer la description de l'image ici

Supprimer les modules .git

 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 

S’il existe un dossier nommé x sous le contrôle git, vous souhaitez append un sous-module de même nom, vous devez supprimer le dossier x et le valider en premier .

Mis à jour par @ ujjwal-singh:

La validation n’est pas nécessaire, la mise en place suffit .. git add / git rm -r

Juste pour clarifier en langage humain ce que l’erreur tente de vous dire:

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

Par exemple: Vous avez un dossier de thème appelé AwesomeTheme qui est un référentiel dédié, vous essayez de le transférer directement dans votre référentiel principal comme git submodule add sites/themes et vous obtenez cet "AwesomeTheme" index already exists .

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

Donc, pour réparer, dans votre repository principal, si vous avez un répertoire sites/theme/AwesomeTheme , supprimez-le. Si vous avez déjà effectué des sites/theme/AwesomeTheme répertoire sites/theme/AwesomeTheme dans votre référentiel principal, vous devez purger tout son historique avec une commande comme celle-ci:

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

Maintenant, vous pouvez lancer git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Puisque le repository principal n’a jamais rien vu (aka index’d) dans sites/themes/AwesomeTheme auparavant, il peut maintenant le créer.

Vous devez d’abord supprimer le repository git de votre sous-module (dossier de projet dans votre cas) pour le chemin git.

 rm -rf projectfolder git rm -r projectfolder 

puis ajoutez le sous-module

 git submodule add  projectfolder 

Je l’ai fait fonctionner à l’inverse. En commençant par un repository vide, en ajoutant le sous-module dans un nouveau dossier appelé “projectfolder / common_code”. Après cela, il était possible d’append le code du projet dans le dossier de projet. Les détails sont indiqués ci-dessous.

Dans un type de repo vide:

 git submodule add url_to_repo projectfolder/common_code 

Cela va créer la structure de dossier souhaitée:

 repo |-- projectfolder |-- common_code 

Il est maintenant possible d’append d’autres sous-modules, et le code du projet peut être ajouté au dossier de projet.

Je ne peux pas encore dire pourquoi cela a fonctionné ainsi et pas l’autre.

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

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