web-dev-qa-db-fra.com

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

Je suis nouveau chez git et j'apprécierais 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 référentiel git distinct pour le code commun et l'ai supprimé des projets avec le plan pour l'ajouter en tant que sous-module git. 

J'ai utilisé l'option de chemin d'accès de git submodule add pour spécifier le dossier:

git submodule add url_to_repo projectfolder

mais alors eu 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 référentiel 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 de projet ......... Que puis-je faire à ce sujet et qu'est-ce que j'ai mal compris à propos de l'option de chemin d'accès de git submodule add?

170
Vanja

Je crains que votre question ne contienne pas assez d'informations pour être sûr 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 que 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'objet est dans l'index à projectfolder. (Celles-ci ressemblent aux systèmes de fichiers Unix, mais ont une signification particulière 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 dans 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 l'ajouter de nouveau sous forme de sous-module, vous pouvez procéder comme suit:

git rm --cached projectfolder

... pour le détacher, 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 vous voyiez apparaître de nombreux blobs (avec les modes de fichier 100644 et 100755), ce qui me suggèrerait que vous n'avez pas correctement désagrégé les fichiers dans projectfolder avant de copier le nouveau référentiel. Si tel est le cas, vous pouvez procéder comme suit pour décomposer tous ces fichiers:

git rm -r --cached projectfolder

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

git submodule add url_to_repo projectfolder
285
Mark Longair

Supprimer manuellement le sous-module implique un 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 de module git est "c3-pro-ios-framework"

Supprimer les fichiers associés au sous-module

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

Supprime toute référence au sous-module dans config

vim .git/config

 enter image description here

Supprimer les .gitmodules

rm -rf .gitmodules

Supprimez-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
35
Gajen Sunthara

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 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 devrait être relatif à la racine du référent parent, pas à votre répertoire de travail, alors faites attention à cela. 

Solution pour l'exemple ci-dessus:

  1. C’est IS d’accord pour que votre référant parent soit déjà cloné.
  2. Assurez-vous que le répertoire common_code contient not exist.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/ (Notez la barre oblique requise.)
  5. La santé mentale restaurée.

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

31
Shelton

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

Mis à jour par @ ujjwal-singh:

Il n’est pas nécessaire de s’engager, la mise en scène suffit .. git add/git rm -r

14
justbilt

Vous devez d'abord supprimer votre référentiel git de sous-module (le 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
14
Neeraj Kumar

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

Vous ne pouvez pas créer de référentiel dans ce dossier qui a déjà fait l'objet d'un 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 vider directement dans votre référentiel principal comme git submodule add sites/themes et vous obtenez ce "AwesomeTheme" index already exists.

Vous devez simplement 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 référentiel principal, si vous avez un répertoire sites/theme/AwesomeTheme vide, supprimez-le. Si vous avez déjà effectué des commits avec le répertoire sites/theme/AwesomeTheme dans votre référentiel principal, vous devez en purger tout l'historique à l'aide d'une commande comme celle-ci:

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

Maintenant, vous pouvez exécuter git submodule add [email protected] sites/themes/AwesomeTheme

Étant donné que le référentiel principal n'a jamais rien vu (a.k.a index'd) dans sites/themes/AwesomeTheme, il peut maintenant le créer.

2
Dylan Pierce

Je l'ai obtenu en le faisant dans l'autre sens. En commençant par un référentiel vide, ajoutez le sous-module dans un nouveau dossier appelé "dossier_projet/code_commun". Après cela, il était possible d'ajouter le code du projet dans le dossier de projet. Les détails sont indiqués ci-dessous.

Dans un type de rapport vide:

git submodule add url_to_repo projectfolder/common_code

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

repo
|-- projectfolder
    |-- common_code

Il est maintenant possible d'ajouter plus de sous-modules, et le code de projet peut être ajouté au dossier de projet.

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

1
Vanja

Je ne sais pas si cela est utile, même si j'ai 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 des commandes git fantaisie. Il suffit de le mentionner au cas où quelqu'un aurait le même problème.

0
Lawrence

Allez dans le dossier du référentiel. Supprimez les sous-modules pertinents de .gitmodules. Sélectionnez Afficher les fichiers cachés. Allez dans le dossier .git, supprimez les sous-modules du dossier module et config.

0
Sam Biswas