Voici une partie du contenu de mon .gitmodules
fichier:
[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 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/config
et exécutiongit 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/config
manuellement et en cours d'exécutiongit 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/config
fonction 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/config
ne fait rien. Le nouveau sous-module est ignoré.
la source
Réponses:
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:
(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
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.
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).
la source
external/pyfacebook
?'your/local/path' already exists and is not a valid git repo
git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
git version 2.7.4. Cette commande met à jour le code local
git submodule update --init --force --remote
la source
git submodule update --init --force --remote <module-name>
.Eu le même problème, quand git ignoré
init
etupdate
commandes, et ne fait rien.COMMENT RÉPARER
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:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
et votre dossier de module (notez que le contenu du dossier ne sera pas validé).git/config
n'y a pas encore de sous-modulesgit submodule init
- et vous verrez un message que le module a enregistrégit submodule update
- récupérera le module.git/config
et vous trouverez le sous-module enregistréla source
Il semble y avoir beaucoup de confusion ici (aussi) dans les réponses.
git submodule init
n'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 clone
projet qui a des sous-modules (que vous saurez par le fait que le clone a extrait un fichier .gitmodules) par ungit submodule update --init --recursive
.Vous ne suivez pas
git submodule add ...
avec ungit submodule init
(ougit 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 pull
de 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 votregit pull
également avec ungit submodule update --init
(plus--recursive
quand 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).la source
git help submodule
cela 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?--init
devrait être nécessaire pour obtenir de nouveaux sous-modules (au lieu de les saisir automatiquementupdate
)? 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--init
cela, vous devez savoir que de nouveaux sous-modules ont peut-être été créés, ou simplement toujours en émettre un à--init
chaque fois, auquel cas, encore une fois, il semblerait qu'il devrait être activé par défaut.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 --recursive
ne faisait rien. J'ai également supprimé le répertoire des sous-modules et ai exécutégit submodules update --init --recursive
et 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
la source
git submodule update
au lieu degit submodule update --remote
.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.
la source
Penser que la configuration manuelle
.gitmodules
suffit est FAUXMon local au
git version 2.22.0
moment d'écrire ces lignes.Je suis donc arrivé à ce fil en me demandant pourquoi ne
git submodule init
fonctionnait pas ; J'ai configuré le.gitmodules
fichier et j'ai continué à fairegit submodule init
...IMPORTANT
git submodule add company/project.git includes/project
est requis (lors de l'ajout du module pour la première fois), cela:.git/config
.gitmodules
fichierincludes/project
dans cet exemple).vous devez alors
git commit
après avoir ajouté le sous-module, cela 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 vide (par exempleincludes/project
dans cet exemple). À ce stade, il.git/config
n'y a pas encore de configuration de sous-module, jusqu'à ce qu'ilgit submodule init
soit exécuté, et rappelez-vous que cela ne fonctionne que parce que.gitmodules
ANDincludes/project
est suivi dans le référentiel git principal.Aussi pour référence voir:
la source
D'après la réponse de Dave James Miller, je peux confirmer que cela a fonctionné pour moi. L'important ici était de valider l'ID de validation des sous-projets. Le simple fait d'avoir l'entrée dans .gitmodules ne suffisait pas.
Voici un commit approprié:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
la source
J'ai eu le même problème.
.gitmodules
avait le sous-module, mais après unegit submodule init
commande, 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
.gitignore
fichier. Cela ne marche pas.la source
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 add
nouvelle 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 pensaisgit submodule sync
.la source
J'ai eu le même problème aujourd'hui et j'ai compris que parce que j'ai tapé
git submodule init
alors j'avais ces lignes dans mon.git/config
:J'ai supprimé cela et tapé:
Et tout était revenu à la normale, mon sous-module mis à jour dans son sous-répertoire comme d'habitude.
la source
Le problème pour moi est que le développeur précédent du repo avait validé le
submodules/thing
dossier comme un dossier normal, ce qui signifie que lorsque j'essayais de l'exécutergit submodule add ...
, cela échouerait avec:,'submodules/thing' already exists in the index
pourtant 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/thing
dossier, valider la suppression, puis exécuter lagit submodule add
commande pour le rajouter correctement:la source
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
.gitmodules
deux 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.la source
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.la source
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] destination
j'ai obtenu la sortie suivante:Donc, j'ai essayé d' appliquer la commande add :
git submodule add --force [email protected] destination
Cela a fonctionné dans mon cas.
la source
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
la source
.git/config
git submodule init
commandegit pull origin master
Cela devrait fonctionner maintenant
la source
Je partage simplement ce qui a fonctionné pour moi:
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.
la source
La commande de synchronisation ci-dessous a résolu le problème:
la source