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
.git/config
et exécution de git submodule init
. Il copie uniquement le sous-module existant précédemment et ignore le nouveau..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é.
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.
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).
la version 2.7.4 de git. Cette commande met à jour le code local
git submodule update --init --force --remote
Avait le même problème, quand git a ignoré les commandes init
et update
, et ne fait rien.
COMMENT RÉPARER
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:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
et votre dossier de modules (notez que le contenu du dossier ne sera pas validé).git/config
n'a encore aucun sous-modulegit submodule init
- et vous verrez un message que ce module a enregistrégit submodule update
- va chercher le module.git/config
et vous trouverez le sous-module enregistréComme par magie, mais aujourd'hui, j'ai exécuté
git submodule init
suivi degit submodule sync
suivi degit 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.
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).
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.
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.
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
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
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.
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.
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.
.git/config
git submodule init
git pull Origin master
Cela devrait fonctionner maintenant
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.
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
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
git submodule add company/project.git includes/project
est obligatoire (lors de l'ajout du module pour la première fois), ceci:
.git/config
.gitmodules
includes/project
dans cet exemple).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: