Git ne lancera pas / synchronisera / mettra à jour les nouveaux sous-modules

113

Voici une partie du contenu de mon .gitmodulesfichier:

[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/configne 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 de fonctionnalités. J'ai hérité du développement maintenant et j'ai vérifié la branche des fonctionnalités. 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-module .git/configet exécution git submodule init. Il copie uniquement le sous-module existant précédemment et ignore le nouveau.
  • Saisie de nouvelles définitions de sous-module .git/configmanuellement et en cours d'exécution git submodule update. Seuls les sous-modules existants prennent la peine de se mettre à jour.

dans diverses combinaisons, mais git ne se mettra tout simplement pas à jour en .git/configfonction du nouveau contenu de .gitmodules, ni ne créera leexternal/pyfacebook dossier et le contenu du sous-module.

Qu'est-ce que je rate? Une intervention manuelle (ajouter manuellement une entrée de sous-module à .git/config) est-elle vraiment nécessaire, et pourquoi?

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

David Eyk
la source
1
exécutant 1.7.7.1 et ayant le même problème: "git submodule sync" ne met pas à jour .git / config après un changement de .gitmodules.
James Pritts
2
Cet article est utile: chrisjean.com/git-submodules-adding-using-removing-and-updating
IgorGanapolsky

Réponses:

92

J'ai eu le 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 validation 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 supprimer de .git / config ou .gitmodules.)

Puis validez-le pour enregistrer correctement l'ID.

Ajout de quelques commentaires supplémentaires à cette réponse de travail: Si le sous-module git init ou la mise à jour du sous-module git ne fonctionne pas, alors comme décrit ci-dessus, git submodule add url devrait faire l'affaire. On peut vérifier cela en

 git config --list

et on devrait obtenir une entrée du sous-module que vous voulez extraire dans le 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 maintenant la mise à jour habituelle du 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 changements locaux dans le sous-module, vous pouvez le voir via git status -u (si vous voulez voir les changements dans le sous-module) ou git status --ignore-submodules (si vous ne voulez pas voir les changements dans le sous-module).

Dave James Miller
la source
A quoi ça sert external/pyfacebook?
IgorGanapolsky
2
@IgorGanapolsky C'est le chemin de destination de votre sous-module.
yuhua
Cela m'a aidé, merci beaucoup! Je pourrais simplement ajouter que si le chemin de destination existe déjà (ce qu'il a fait pour moi après avoir essayé d'autres commandes), on obtient le message suivant qui ne fait qu'ajouter à la confusion:'your/local/path' already exists and is not a valid git repo
Michael Ambrus
1
une ligne pour lire les entrées dans "git config --list":git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
Puggan Se
64

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

Palik
la source
20
Ne rien faire pour moi.
Carlo Wood
1
en ce qui concerne git-submodule [documentation) ( git-scm.com/docs/git-submodule#git-submodule---remote ), la commande susmentionnée devrait mettre à jour la branche locale des sous-modules.
palik
1
@palik vous rockez!
Denis Trofimov
1
Vous pouvez mettre à jour un module individuel avec git submodule update --init --force --remote <module-name>.
Adam Faryna
15

Eu le même problème, quand git ignoré initet updatecommandes, et ne fait rien.

COMMENT RÉPARER

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

Si ces conditions sont remplies, cela fonctionnera. Sinon, toutes les commandes s'exécuteront 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 pousser tous les fichiers - .gitmoduleset votre dossier de module (notez que le contenu du dossier ne sera pas validé)
  5. déposer votre dépôt git local
  6. cloner un nouveau
  7. assurez-vous qu'il .git/confign'y a pas encore de sous-modules
  8. Maintenant, git submodule init- et vous verrez un message que le module a enregistré
  9. git submodule update - récupérera le module
  10. Maintenant, regardez .git/configet vous trouverez le sous-module enregistré
Alex Ivasyuv
la source
1
Je crois que le chemin vers les sous-modules PEUT être en .gitignore. Au moins, je l'ai fait fonctionner en suivant la réponse de @DaveJamesMiller. Rien d'autre n'a fonctionné pour moi.
gebbissimo le
7

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

git submodule initn'est pas destiné à générer des éléments par magie 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 après avoir extrait un commit qui ajoute un sous-module précédemment inexistant.

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

Vous ne suivez pasgit submodule add ... avec un git submodule init(ou git submodule update --init), ce n'est pas censé fonctionner. En fait, l'ajout mettra déjà à jour le .git / config approprié si les choses fonctionnent.

ÉDITER

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

Carlo Wood
la source
1
C'est intéressant, car git help submodulecela dit à propos de init: "init: Initialisez les sous-modules enregistrés dans l'index (qui ont été ajoutés et validés ailleurs) en copiant les noms de sous-modules et les URL de .gitmodules vers .git / config." Donc, il semble qu'il devrait faire exactement ce que vous dites qu'il ne fait pas ...? Il est temps de mettre à jour la documentation de git?
Brad
@brad Je ne pense pas avoir dit cela - mais j'ai ajouté une clarification pour ce cas spécifique. Merci.
Carlo Wood
@CarloWood une idée de la raison pour laquelle les auteurs de sous-modules git ont décidé que cela --initdevrait être nécessaire pour obtenir de nouveaux sous-modules (au lieu de les saisir automatiquement update)? Il semble que la mise à jour de votre référentiel devrait récupérer tout ce qui est nécessaire à moins que cela ne détruise les données. Avec --initcela, vous devez savoir que de nouveaux sous-modules ont peut-être été créés, ou simplement toujours en émettre un à --initchaque fois, auquel cas, encore une fois, il semblerait qu'il devrait être activé par défaut.
Catskul
@Catskul Évidemment, je n'ai aucune idée de la raison pour laquelle les auteurs des sous-modules git ont décidé quoi que ce soit, mais je suppose que "update" est réservé à la mise à jour de quelque chose qui existe déjà, et "init" est utilisé pour créer quelque chose de nouveau (localement). Sous le capot, les deux sont probablement suffisamment différents pour justifier une commande différente.
Carlo Wood
6

J'ai eu le même problème mais aucune des solutions ci-dessus n'a aidé. Les entrées dans .gitmodules et dans .git / config étaient correctes mais la commande git submodules update --init --recursivene faisait rien. J'ai également supprimé le répertoire des sous-modules et ai exécuté git submodules update --init --recursiveet récupéré le répertoire des sous-modules, mais avec exactement le même commit qu'avant.

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

masterop
la source
2
C'était aussi la bonne solution pour moi. Je courais git submodule updateau lieu de git submodule update --remote.
Andrew Medlin
5

Un peu comme par magie, mais aujourd'hui j'ai couru git submodule initsuivi de git submodule syncsuivi de git submodule updateet ça a commencé à tirer mes sous-modules ... Magie? Peut-être! C'est vraiment l'une des expériences les plus ennuyeuses avec Git…

Grattez ça. Je l'ai fait fonctionner 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 de git, pas dans celui du sous-module.

Levi Figueira
la source
7
Non, ça ne fait absolument rien pour moi.
IgorGanapolsky
@IgorGanapolsky J'ai édité la réponse ci-dessus avec ce qui a fonctionné pour moi. Dites moi si ca marche!
Levi Figueira
J'ai essayé vos nouvelles commandes, mais elles n'ont rien fait non plus.
IgorGanapolsky
5

Penser que la configuration manuelle .gitmodulessuffit est FAUX

Mon local au git version 2.22.0moment d'écrire ces lignes.

Je suis donc arrivé à ce fil en me demandant pourquoi ne git submodule initfonctionnait pas ; J'ai configuré le .gitmodulesfichier et j'ai continué à faire git submodule init...

IMPORTANT

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

    • ajouter la configuration à .git/config
    • mettre à jour le .gitmodulesfichier
    • suivre l'emplacement du sous-module ( includes/projectdans cet exemple).
  2. vous devez alors git commitaprès avoir ajouté le sous-module, cela validera .gitmoduleset l'emplacement du sous-module suivi.

Lorsque le projet est à nouveau cloné, il aura le .gitmoduleset le répertoire de sous-modules vide (par exemple includes/projectdans cet exemple). À ce stade, il .git/confign'y a pas encore de configuration de sous-module, jusqu'à ce qu'il git submodule initsoit exécuté, et rappelez-vous que cela ne fonctionne que parce que .gitmodulesAND includes/projectest suivi dans le référentiel git principal.

Aussi pour référence voir:

farinspace
la source
3

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

.gitmodulesavait le sous-module, mais après une git submodule initcommande, il n'était pas dans .git/config.

Il s'avère que le développeur qui a ajouté le sous-module a également ajouté le répertoire du sous-module au .gitignorefichier. Cela ne marche pas.

joseph.hainline
la source
2

Comme vous, j'ai trouvé que la synchronisation des sous-modules git ne fait pas ce que vous attendez d'elle. Ce n'est qu'après avoir fait une git submodule addnouvelle explicite qu'un changement d'URL de sous-module.

Donc, 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 git post-réception.

Tout ce que j'ai à faire maintenant est d'éditer .gitmodules, puis d'exécuter ce script et cela fonctionne enfin comme je le pensais git submodule sync.

fridh
la source
Cela ne semble se produire que sur certains dépôts ... probablement à cause d'un bogue dans Git. Cela ne m'est pas arrivé sur les référentiels nouvellement créés depuis longtemps, mais il y a longtemps, cela se produisait tout le temps sur certains
dépôts
2

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

[submodule]
   active = .

J'ai supprimé cela et tapé:

git submodule update --init --remote

Et tout était revenu à la normale, mon sous-module mis à jour dans son sous-répertoire comme d'habitude.

Eric Jeker
la source
2

Le problème pour moi est que le développeur précédent du repo avait validé le submodules/thingdossier comme un dossier normal, ce qui signifie que lorsque j'essayais de l'exécuter git submodule add ..., cela échouerait avec:, 'submodules/thing' already exists in the indexpourtant essayer de mettre à jour le sous-module échouerait également car il voyait que le chemin ne fonctionnait pas contiennent un sous-module.

Pour réparer, j'ai dû supprimer le submodules/thingdossier, valider la suppression, puis exécuter la git submodule addcommande pour le rajouter correctement:

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing
Venryx
la source
1

Quand j'ai vu cela aujourd'hui, un développeur avait 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, au lieu de cela, ils étaient juste nuked, laissant les .gitmodulesdeux renvoyer à périmés emplacements et aux sous-projets qui n'existaient plus dans l'arborescence actuelle.

Ajout des sous-modules et comparaison des shas de validation du sous-module à ceux trouvés dans git show $breaking_commit_sha(recherche de lignes correspondant à l'expression rationnelle ^-Subproject) pour ajuster au besoin les choses fixes.

Phil P
la source
1

La suppression du répertoire du sous-module et de son contenu (dossier "external / pyfacebook") s'il existe auparavant git submodule add ...peut résoudre des problèmes.

atahan
la source
1
C'était le problème pour moi. Quelqu'un avait validé le dossier "submodule" comme un dossier normal, ce qui signifie que lorsque j'essayais d'exécuter "git submodule add ...", cela échouait avec: "'vendor / mobx-state-tree' existe déjà dans l'index" , mais essayer de mettre à jour le sous-module échouerait également car il voyait que le chemin ne contenait pas de sous-module). Pour réparer, j'ai dû supprimer le dossier, valider la suppression, puis exécuter la commande git add pour le rajouter correctement.
Venryx
1

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

En essayant de rajouter le sous-module en utilisant, git submodule add [email protected] destinationj'ai obtenu la sortie suivante:

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.

Donc, j'ai essayé d' appliquer la commande add :
git submodule add --force [email protected] destination

Cela a fonctionné dans mon cas.

Arvid
la source
0

Pour mémoire:
j'ai créé le même problème en ajoutant un référentiel 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 d'origine.

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

Marc
la source
0
  • Retirez le sous-module de votre .git/config
  • Exécuter la git submodule initcommande
  • Accédez au répertoire de votre sous-module et exécutez git pull origin master

Cela devrait fonctionner maintenant

Masoud Darvishian
la source
0

Je partage simplement ce qui a fonctionné pour moi:

git clone --recurse-submodules <repository path>

Cela clone le référentiel distant comprenant déjà les sous-modules. Cela signifie que vous n'aurez pas besoin d'exécuter la mise à jour du sous-module git ou init après le clonage.

Anne Kariny Silva Freitas
la source
0

La commande de synchronisation ci-dessous a résolu le problème:

git submodule sync
Nishant Chauhan
la source