Ajout de sous-module Git: problème "un répertoire git est trouvé localement"

194

J'essaie en fait d'apprendre à utiliser git, y compris les git submodulesous - commandes. J'ai déjà configuré un serveur sur lequel je peux héberger, pousser et extraire des référentiels git en utilisant SSH. J'ai créé un référentiel git principal "Travail" sur ce serveur dans lequel je voudrais mettre tous mes projets sous forme de sous-modules.

Dans mon référentiel Travail, j'ai déjà ajouté un de mes projets en tant que sous-module à tools/libft: Je suis capable de développer ce sous-module, de le pousser et de le tirer.

Mais lorsque j'essaye d'ajouter un autre sous-module (nommé fdf, à partir de fdf.git sur mon serveur), j'obtiens le problème suivant:

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf

Un répertoire git pour 'projets / fdf' est trouvé localement avec remote (s): origin ssh: //[email protected]: XXXXX / opt / git / fdf.git Si vous souhaitez réutiliser ce git local au lieu de cloner à nouveau à partir de ssh: //XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git utilisez l'option '--force'. Si le répertoire git local n'est pas le bon dépôt ou si vous n'êtes pas sûr de ce que cela signifie, choisissez un autre nom avec l'option '--name'.

Il n'y a en fait aucun sous-répertoire dans projets/

J'ai lu sur un autre fil que je devrais utiliser git submodule syncou modifier le fichier .gitmodules dans lequel l'URL du référentiel d'origine de mon sous-module aurait pu changer.

Mais mon fichier .gitmodules ne contient que les informations sur mon premier sous-module (tools / libft), pas sur projets / fdf:

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://[email protected]:XXXXX/opt/git/libft.git

En tant qu'étudiant français, j'aurais pu manquer quelque chose dans la documentation en anglais que j'ai, mais j'ai cherché et je ne comprends vraiment pas pourquoi je reçois ce problème.

Je serais heureux si j'obtenais une solution, mais une simple explication serait également utile.

vmonteco
la source
Une petite correction: c'est «référentiel», pas «dépositaire». Ce n'est pas vraiment une réponse, mais si les projets sont indépendants les uns des autres, il serait préférable que chaque projet ait son propre référentiel au lieu de sous-modules.
jcm
Merci, j'ai corrigé. Je sais mais j'aimerais rassembler tout mon travail dans le même repo mais en tant que projets séparés. C'est un choix de garder tout mon travail à jour quand je vais de la maison à mon école et vice versa (et pour apprendre à utiliser ces outils, je suis curieux;))
vmonteco
Eh bien, la curiosité est toujours une bonne raison! :) C'est étrange. Êtes-vous sûr de ne pas avoir ajouté le sous-module auparavant?
jcm
Pas dans Travail /, et je n'ai aucun problème pour cloner fdf.git dans ~ /. Dans Travail / je ne trouve aucune trace de fdf. juste libft: /
vmonteco
5
Oh attendez, j'ai regardé /Travail/.git/modules/projets/et j'ai trouvé un fdfrépertoire. Cela ne semble pas être dans l'arbre de travail mais dans les commits plus anciens. Cela pourrait-il générer le problème?
vmonteco

Réponses:

445

Je suis arrivé à ce message SO en essayant d'ajouter un sous-module avec le même chemin qu'un sous-module que j'ai récemment supprimé.

C'est ce qui a finalement fonctionné pour moi ( cet article a beaucoup aidé ):

Si vous ne l'avez pas déjà exécuté git rm --cached path_to_submodule(pas de barre oblique finale) rm -rf path_to_submodule, faites-le!

Ensuite:

  1. Supprimez les lignes pertinentes du .gitmodulesfichier. par exemple, supprimez-les:

    [submodule "path_to_submodule"] path = path_to_submodule url = https://github.com/path_to_submodule

  2. Supprimez la section appropriée de .git / config. par exemple, supprimez-les:

    [submodule "path_to_submodule"] url = https://github.com/path_to_submodule

  3. rm -rf .git/modules/path_to_submodule

Ensuite, vous pouvez enfin:

git submodule add https://github.com/path_to_submodule

jbmilgrom
la source
47
Cela a été vraiment utile, car je ne pouvais rien trouver d'autre qui fonctionnait. La principale différence par rapport aux autres suggestions était votre étape 3. Merci!
AndroidDev
8
Les étapes 2 et 3 étaient nécessaires pour moi.
U007D
8
L'étape 3 était nécessaire pour moi, mais pourquoi le sous-module existe-t-il là aussi?
Crt
1
Pour moi, j'ai sauté les étapes 1 et 2 (qui avaient déjà les bons paramètres) et l'étape 3 l'a corrigé pour moi. (J'avais déjà fait la première étape git rmet les rm -rfétapes.)
Rock Lee
2
Même l'étape 3 n'a pas fonctionné pour moi. Je n'avais qu'un seul sous-module, j'ai donc supprimé le tout .git/moduleset cela a fini par fonctionner.
ach
47

J'ai essayé la solution de jbmilgrom, en particulier j'ai essayé git rm --cacheet cela n'a pas fonctionné pour moi non plus car le répertoire / sous-module n'était pas là. Ce qui a fonctionné pour moi était:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

Je l'ai fait après avoir essayé --forcedans les git submodulecommandes et rmtous les autres répertoires, pushs to master etc ... le répertoire n'existait pas et il n'y avait aucune raison pour le cache. Il s'avère .git/modulesque c'est là que se trouvait cette erreur.

pjammer
la source
15

Vous avez peut-être supprimé votre 'projets/fdf'disque, mais votre référentiel Git l'a toujours. Utilisez git rm -rf projets/fdfpour le supprimer de Git, puis validez les modifications. Après cela, vous pourrez ajouter ce dossier en tant que sous-module.

bredikhin
la source
Cela a fonctionné :) Merci. Je pense que j'ai fait cette erreur.
vmonteco
21
On me dit que le répertoire n'existe pas lorsque je fais cela. Il semble que cela existe et non: /
Nathan Hornby
41
@ tom-mcfarlin En fin de compte, j'ai supprimé des lignes de .gitmodule et un dossier de .git / modules, puis il m'a permis d'ajouter un nouveau sous-module. Il y a peut-être une meilleure façon de le faire, mais je manquais de temps. Si vous allez dans cette direction, je vous recommande de faire une bonne sauvegarde et ne me blâmez pas si cela ne va pas pour vous. Bonne chance.
sparklos
5
Merci, j'ai trouvé sur un autre post pour supprimer le dossier de .git / modules et cela a fonctionné pour moi. Cela a du sens car c'est ce que l'erreur a dit était le conflit ... Je n'étais tout simplement pas au courant de ce dossier
Tom McFarlin
10
@NathanHornby @Sparklos @TomMcFarlin - Dans les versions plus récentes de git, vous trouverez que git-submodule ajoute un répertoire dans le dossier .git. Par exemple, si vous êtes dans le répertoire /tmp/repo, puis exécutez git submodule add ../otherrepo.git, vous verrez que ce /tmp/repo/.git/modules/otherrepodossier existe. Voilà le problème pour moi. J'ai supprimé manuellement ce dossier de .git, et tout a fonctionné.
Alexander Bird
13

Si vous avez déjà supprimé le répertoire du sous-module, comme je l'ai fait, suivez le reste des instructions de jbmilgrom. La clé est rm -rf .git/modules/path_to_submodulemais allez-y et sauvegardez d'abord tout votre répertoire de dépôt parent .

Si vous n'aviez qu'un sous-module, supprimez simplement .gitmodules

Dmitri R117
la source
2

Ces deux commandes fonctionnent pour moi.

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf
W.Perrin
la source
Ce. Il semble qu'il existe deux façons de créer des sous-modules. Dans l'un d'eux, le sous-dossier n'aura qu'un seul fichier .git qui pointe simplement vers un répertoire du superprojet, en commençant par .git/modules/. Dans il y a un dossier qui stocke le référentiel pour le sous-module. La suppression de ce référentiel a résolu le problème pour moi, contrairement à la réponse acceptée.
William Randokun