299 votes

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

Je suis nouveau sur git et j'apprécierais de l'aide pour ajouter des submodules. J'ai reçu deux projets partageant un code commun. Le code partagé a été simplement 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 l'intention de l'ajouter en tant que git sous-module.

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

git submodule add url_to_repo projectfolder

mais ensuite j'ai eu l'erreur :

'projectfolder' already exists in the index"

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

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

Il est possible d'ajouter le git directement dans le dépôt, ou dans un nouveau dossier, mais pas dans le dossier du projet. Le problème est qu'il faut vraiment qu'il soit dans le dossier du projet Que puis-je faire à ce sujet et qu'ai-je mal compris de l'option path de git submodule add ?

0 votes

Qu'est-ce que vous obtenez si vous faites git ls-files --stage projectfolder ?

0 votes

J'obtiens une liste avec tout le contenu commençant par 100644.

0 votes

454voto

Mark Longair Points 93104

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

Cette erreur signifie que projectfolder est déjà mis en scène ("existe déjà dans l'index"). Pour savoir ce qui se passe ici, essayez de lister 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'objet se trouve dans l'index à projectfolder . (Ils ressemblent à des filemodes 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 dépôt en projectfolder a déjà été ajouté en tant que "gitlink". S'il n'apparaît pas dans la sortie de git submodule et que vous souhaitez le réinsérer en tant que sous-module, vous pouvez le faire :

git rm --cached projectfolder

... pour le déstabiliser, et ensuite :

git submodule add url_to_repo projectfolder

... pour ajouter le référentiel comme un sous-module.

Cependant, il est également possible que vous voyiez de nombreux blobs listés (avec des modes de fichiers 100644 y 100755 ), ce qui me laisse penser que vous n'avez pas correctement déstocké les fichiers dans le fichier projectfolder avant de copier le nouveau référentiel en place. Si c'est le cas, vous pouvez faire ce qui suit pour déstocker tous ces fichiers :

git rm -r --cached projectfolder

... et ensuite ajouter le sous-module avec :

git submodule add url_to_repo projectfolder

16 votes

Merci Mark pour votre réponse détaillée. J'ai fait un "git rm -r --cached projectfolder" et j'ai essayé d'attacher le submodule à nouveau. Cependant, cette fois, j'obtiens l'erreur rmessage "'projectfolder' existe déjà et n'est pas un repo git valide".

3 votes

@Vanja : Cela indique que projectfolder ne contenait pas de .git annuaire. D'après votre question, il semble que vous ayez créé le nouveau référentiel pour projectfolder ailleurs, et l'a copié en place, mais il est clair que ce n'était pas le cas. Vous devez déplacer le fichier existant projectfolder puis copier le nouveau référentiel (avec son code d'accès). .git ) en place avant de l'ajouter en tant que sous-module. Ou, si vous l'avez déjà poussé dans le référentiel représenté par url_to_repo tu pourrais juste bouger projectfolder et ensuite ajouter le sous-module à partir de cette URL.

0 votes

Réponse géniale +1 sur toute la ligne

111voto

Neeraj Kumar Points 103

Vous devez d'abord supprimer le dépôt git de votre sous-module (le dossier du projet dans ce cas) pour le chemin git.

rm -rf projectfolder

git rm -r projectfolder

et ensuite ajouter le sous-module

git submodule add <git_submodule_repository> projectfolder

72voto

Gajen Sunthara Points 9

La suppression du sous-module manuellement implique un certain nombre d'é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 de l'échantillon est "c3-pro-ios-framework".

Supprime les fichiers associés au sous-module

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

Supprimer toute référence au sous-module dans la configuration

vim .git/config

enter image description here

Supprimer .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

34voto

Shelton Points 146

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

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

La solution est de NE PAS créer le répertoire qui accueillera le sous-module. Le répertoire sera créé dans le cadre de l'opération git submodule add commandement.

En outre, l'argument est censé être relatif à la racine du dépôt parent, et non à votre répertoire de travail, alors faites attention à cela.

Solution pour l'exemple ci-dessus :

  1. Il n'y a pas de problème à ce que votre repo parent soit déjà cloné.
  2. Assurez-vous que le common_code Le répertoire fait no existent.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/ ( Notez la barre oblique de fin requise. )
  5. La santé mentale est restaurée.

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

1 votes

L'étape 4 devrait commencer git submodule add et la barre oblique de fin n'est pas nécessaire.

0 votes

J'ai corrigé la faute de frappe. J'ai refait le test, et le slash de fin de ligne a fait une différence pour moi. J'utilise zsh si cela a un effet.

0 votes

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

22voto

justbilt Points 418

S'il existe un dossier nommé x sous le contrôle de git, vous voulez ajouter un sous-module de même nom, vous devez supprimer le dossier x et le commettre d'abord .

Mis à jour par @ujjwal-singh :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X