web-dev-qa-db-fra.com

Git ne va pas initier/synchroniser/mettre à jour de nouveaux sous-modules

Voici une partie du contenu de mon fichier .gitmodules:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/Django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

Cependant, .git/config ne contient que le premier:

[submodule "src/static_management"]
        url = git://github.com/eykd/Django-static-management.git

Le deuxième sous-module (external/pyfacebook) a été ajouté par un autre développeur dans une branche. J'ai hérité du développement maintenant et jeté un coup d'œil à la branche de fonctionnalité. Cependant, Git ne tirera pas le sous-module pour moi. J'ai essayé:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Suppression de toutes les définitions de sous-modules de .git/config et exécution de git submodule init. Il copie uniquement le sous-module existant précédemment et ignore le nouveau.
  • Saisie manuelle de nouvelles définitions de sous-modules dans .git/config et exécution de git submodule update. Seuls les sous-modules existants prennent la peine de mettre à jour.

dans diverses combinaisons, mais git ne mettra tout simplement pas à jour .git/config en fonction du nouveau contenu de .gitmodules, pas plus qu'il ne créera le dossier external/pyfacebook et extraira le contenu du sous-module. 

Qu'est-ce que je rate? Une intervention manuelle (en ajoutant manuellement une entrée de sous-module à .git/config) est-elle réellement requise et pourquoi?

Edit: / L'intervention manuelle ne fonctionne pas. Ajouter manuellement la nouvelle entrée de sous-module à .git/config ne fait rien. Le nouveau sous-module est ignoré.

84
David Eyk

Avez-vous récemment effectué une mise à niveau vers la version 1.7.0.4 de Git? J'ai eu et j'ai maintenant des problèmes similaires ... 

Edit: J'ai résolu mon problème mais je ne sais absolument pas où se trouvait le problème. J'ai manuellement supprimé les entrées de sous-modules de .git/config et .gitmodules et rajouté mes sous-modules avec les étapes habituelles (git submodule add etc ...) ... Worksforme mais n'ajoute aucune valeur à ce fil. 

31
Quickredfox

J'ai eu ce même problème - il s'est avéré que le fichier .gitmodules était validé, mais le commit réel du sous-module (c'est-à-dire l'enregistrement de l'ID de commit du sous-module) ne l'était pas.

L'ajouter manuellement semblait faire l'affaire - par exemple:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(Même sans rien enlever de .git/config ou .gitmodules.)

Puis engagez-le pour enregistrer correctement l'ID.

Ajouter quelques commentaires supplémentaires à cette réponse: Si le sous-module git init ou la mise à jour du sous-module git ne fonctionne pas, alors, comme décrit ci-dessus, ajouter un URL sous-module devrait faire l'affaire. On peut vérifier cela par 

 git config --list

et vous devriez obtenir une entrée du sous-module que vous voulez extraire du résultat de la commande git config --list. S'il y a une entrée de votre sous-module dans le résultat de la configuration, alors la mise à jour habituelle de sous-module git --init devrait extraire votre sous-module. Pour tester cette étape, vous pouvez renommer manuellement le sous-module, puis mettre à jour le sous-module. 

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Pour savoir si vous avez des modifications locales dans le sous-module, vous pouvez le voir via git status -u (si vous voulez voir les modifications dans le sous-module) ou git status --ignore-submodules le sous-module).

71
Dave James Miller

la version 2.7.4 de git. Cette commande met à jour le code local git submodule update --init --force --remote

42
palik

Avait le même problème, quand git a ignoré les commandes init et update, et ne fait rien.

COMMENT RÉPARER

  1. Votre dossier de sous-modules doit être validé dans git repo
  2. Il ne devrait pas être dans .gitignore

Si ces conditions sont remplies, cela fonctionnera. Sinon, toutes les commandes seront exécutées sans aucun message ni résultat.

Si vous avez fait tout cela et que cela ne fonctionne toujours pas:

  1. Ajouter un sous-module manuellement, par exemple git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. valider et envoyer tous les fichiers - .gitmodules et votre dossier de modules (notez que le contenu du dossier ne sera pas validé)
  5. déposez votre dépôt git local
  6. cloner un nouveau
  7. s'assurer que .git/config n'a encore aucun sous-module
  8. Maintenant, git submodule init - et vous verrez un message que ce module a enregistré
  9. git submodule update - va chercher le module
  10. Maintenant, regardez .git/config et vous trouverez le sous-module enregistré
14
Alex Ivasyuv

Comme par magie, mais aujourd'hui, j'ai exécuté git submodule init suivi de git submodule sync suivi de git submodule update et tout a commencé en tirant mes sous-modules ... Magie? Peut-être! C'est vraiment l'un des plus expériences ennuyeuses avec Git…

Grattez ça. En fait, je l'ai obtenu en faisant git submodule update --init --recursive. J'espère que cela t'aides.

PS: Assurez-vous que vous êtes dans le répertoire racine git, pas dans le sous-module.

3
Levi Figueira

Il semble y avoir beaucoup de confusion ici (aussi) dans les réponses.

git submodule init est not destiné à générer par magie des éléments dans .git/config (à partir de .gitmodules). Il est prévu de configurer quelque chose dans un sous-répertoire entièrement vide après le clonage du projet parent ou l'extraction d'un commit qui ajoute un sous-module précédemment non existant.

En d'autres termes, vous suivez un git clone d'un projet comportant des sous-modules (que vous saurez par le fait que le clone a extrait un fichier .gitmodules) d'un git submodule update --init --recursive.

Vous faites pas suivez git submodule add ... avec un git submodule init (ou git submodule update --init), cela ne devrait pas fonctionner. En fait, add mettra déjà à jour le fichier .git/config approprié si tout fonctionne.

MODIFIER

Si un sous-module git précédemment non existant a été ajouté par quelqu'un d'autre et que vous effectuez un git pull de cette validation, le répertoire de ce sous-module sera entièrement vide (lorsque vous exécuterez git submodule status, le hachage du nouveau sous-module devrait être visible mais comporterait un - devant.) Dans ce cas, vous devez également suivre votre git pull avec un git submodule update --init (plus --recursive s’il s’agit d’un sous-module à l’intérieur d’un sous-module) afin d’extraire le sous-module précédemment inexistant; comme après un premier clone d'un projet avec des sous-modules (où vous n'aviez évidemment pas ces sous-modules auparavant non plus).

3
Carlo Wood

J'ai eu le même problème. 

.gitmodules avait le sous-module, mais après une commande git submodule init, il n'était pas dans .git/config.

Le développeur qui a ajouté le sous-module a également ajouté le répertoire du sous-module au fichier .gitignore. Ça ne marche pas.

2
joseph.hainline

Comme vous, j’ai constaté que la synchronisation des sous-modules git ne correspond pas à ce que vous attendez de le faire . Ce n’est qu’après avoir effectué un git submodule add explicite que l’URL du sous-module est modifiée.

Alors, j'ai mis ce script dans ~/bin/git-submodule-sync.rb:

https://Gist.github.com/frimik/5125436

Et j'utilise également la même logique sur quelques scripts de déploiement post-réception de git.

Tout ce que je dois faire maintenant est de modifier .gitmodules, puis d’exécuter ce script et il fonctionne enfin comme je pensais que git submodule sync était censé le faire.

2
fridh

Selon la réponse de Dave James Miller, je peux confirmer que cela a fonctionné pour moi. L'important était de valider l'ID de validation des sous-projets. Juste avoir l'entrée dans .gitmodules n'était pas suffisant.

Voici un commit approprié:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae

2
dirkaholic

J'ai eu le même problème, mais aucune des solutions ci-dessus n'a aidé. Les entrées dans les .gitmodules et dans .git/config avaient raison mais la commande git submodules update --init --recursive ne faisait rien. J'ai également supprimé le répertoire du sous-module et exécuté git submodules update --init --recursive et récupéré le répertoire du sous-module, mais avec exactement le même commit que précédemment.

J'ai trouvé la réponse sur ceci page . La commande est la suivante: git submodule update --remote

2
masterop

Quand j'ai vu cela aujourd'hui, un développeur a déplacé une partie de l'arborescence dans un nouveau sous-répertoire et il semble que son client git n'ait pas enregistré les règles de sous-projet mises à jour dans l'arborescence. Elles ont simplement été archivées, laissant .gitmodules faisant référence à la fois à des emplacements obsolètes et des sous-projets qui n'existaient plus dans l'arbre en cours.

Ajouter les sous-modules dans, et comparer les commandes commit du sous-module à celles trouvées dans git show $breaking_commit_sha (rechercher les lignes correspondant à regexp ^-Subproject) pour ajuster si nécessaire les choses fixes.

1
Phil P

J'ai eu le même problème aujourd'hui et j'ai compris que parce que j'avais tapé git submodule init, j'avais ces lignes dans mon .git/config:

[submodule]
   active = .

J'ai enlevé ça et tapé:

git submodule update --init --remote

Et tout était rentré dans l'ordre, mon sous-module a été mis à jour dans son sous-répertoire comme d'habitude.

1
Eric Jeker

J'ai eu un problème similaire avec un sous-module. Il ne voulait tout simplement pas être cloné/extrait/mis à jour/peu importe.

En essayant de rajouter le sous-module en utilisant git submodule add [email protected] destination, j'ai obtenu le résultat suivant:

A git directory for 'destination' is found locally with remote(s):
  Origin        [email protected]
If you want to reuse this local git directory instead of cloning again from
  [email protected]
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

J'ai donc essayé de appliquer la commande add :
git submodule add --force [email protected] destination

Cela a fonctionné dans mon cas.

1
Arvid
  • Supprimer le sous-module de votre .git/config
  • Exécuter la commande git submodule init
  • Accédez à votre répertoire de sous-modules et exécutez git pull Origin master

Cela devrait fonctionner maintenant

0
Masoud Darvishian

Supprimer le répertoire du sous-module et son contenu (dossier "external/pyfacebook") s'il existait avant le git submodule add ... pourraient résoudre les problèmes.

0
atahan

Pour mémoire:
J'ai créé le même problème en ajoutant un dépôt vide en tant que sous-module. Dans ce cas, il n'y avait pas de hachage de référence disponible pour le sous-module, ce qui a entraîné l'erreur décrite par l'affiche originale.

L'ajout forcé du référentiel après s'être engagé à résoudre le problème (comme dans post Arvids)
git submodule add --force [email protected] destination

0
Marc

Penser que configurer manuellement .gitmodules est suffisant, c'est FAUX

Mon local git version 2.22.0 au moment de l'écriture.

Je suis donc venu sur ce sujet en me demandant pourquoi git submodule init ne fonctionnait pas; J'ai installé le fichier .gitmodules et j'ai ensuite procédé à git submodule init ...

IMPORTANT

  1. git submodule add company/project.git includes/project est obligatoire (lors de l'ajout du module pour la première fois), ceci:

    • ajouter config à .git/config
    • mettre à jour le fichier .gitmodules
    • suivre l'emplacement du sous-module (includes/project dans cet exemple).
  2. vous devez puis git commit après avoir ajouté le sous-module, ceci validera .gitmodules et l'emplacement du sous-module suivi.

Lorsque le projet est à nouveau cloné, il aura le .gitmodules et le répertoire de sous-modules vides (par exemple, includes/project dans cet exemple). À ce stade, .git/config n'a pas encore de configuration de sous-module, jusqu'à ce que git submodule init soit exécuté, et rappelez-vous que cela ne fonctionne que parce que .gitmodules ET includes/project sont suivis dans le dépôt principal git.

Aussi pour référence voir:

0
farinspace