Question Mettre à jour le sous-module Git vers le dernier commit sur l'origine


J'ai un projet avec un sous-module Git. Il provient d'une URL ssh: // ... et est sur la validation A. Commit B a été poussé vers cette URL, et je veux que le sous-module récupère le commit, et passe à celui-ci.

Maintenant, ma compréhension est que git submodule update devrait le faire, mais ce n'est pas le cas. Il ne fait rien (pas de sortie, code de sortie de succès). Voici un exemple:

$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://user@host/git/mod mod
Cloning into mod...
user@host's password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 mod
# At this point, ssh://user@host/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://user@host/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule 
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...

J'ai aussi essayé git fetch mod, qui semble faire un fetch (mais ne peut pas, car il ne demande pas de mot de passe!), mais git log et git show nier l'existence de nouveaux commits. Jusqu'à présent, je viens d'être rm-développer le module et le rajouter, mais c'est à la fois faux en principe et fastidieux en pratique.


612
2018-04-29 05:41


origine


Réponses:


le git submodule update commande indique en fait à Git que vous voulez que vos sous-modules vérifient chacun la validation déjà spécifiée dans l'index du superprojet. Si tu veux mettre à jour vos sous-modules à la dernière validation disponible depuis leur télécommande, vous devrez le faire directement dans les sous-modules.

Donc en résumé:

# get the submodule initially
git submodule add ssh://bla submodule_dir
git submodule init

# time passes, submodule upstream is updated
# and you now want to update

# change to the submodule directory
cd submodule_dir

# checkout desired branch
git checkout master

# update
git pull

# get back to your project root
cd ..

# now the submodules are in the state you want, so
git commit -am "Pulled down update to submodule_dir"

Ou, si vous êtes une personne occupée:

git submodule foreach git pull origin master

1068
2018-04-29 05:50



Git 1.8.2 dispose d'une nouvelle option --remote cela permettra exactement ce comportement. Fonctionnement

git submodule update --remote --merge

récupérera les dernières modifications en amont dans chaque sous-module, les fusionnera et vérifiera la dernière révision du sous-module. Comme les docs Mets-le:

--éloigné

Cette option est uniquement valide pour la commande de mise à jour. Au lieu d'utiliser le SHA-1 enregistré du superprojet pour mettre à jour le sous-module, utilisez l'état de la branche de suivi à distance du sous-module.

Ceci est équivalent à courir git pull dans chaque sous-module, ce qui est généralement exactement ce que vous voulez.


313
2018-01-17 20:24



dans le répertoire parent de votre projet, exécutez:

git submodule update --init 

ou si vous avez des sous-modules récursifs:

git submodule update --init --recursive

parfois, cela ne fonctionne toujours pas parce que vous avez des changements locaux dans le sous-module local pendant que le sous-module est mis à jour.

La plupart du temps, le changement local n'est peut-être pas celui que vous voulez commettre. Cela peut se produire en raison d'une suppression de fichier dans votre sous-module, etc. Dans ce cas, effectuez une réinitialisation dans votre sous-module local et dans le répertoire parent de votre projet:

git submodule update --init --recursive 

93
2018-06-18 08:25



Votre projet principal pointe vers un commit particulier auquel le sous-module doit être. Quelle git submodule update est d'essayer de vérifier cette validation dans chaque sous-module qui a été initialisé. Le sous-module est vraiment un référentiel indépendant - il suffit de créer un nouveau commit dans le sous-module et en le poussant cela ne suffit pas, vous devez également ajouter explicitement la nouvelle version du sous-module dans le projet principal.

Donc, dans votre cas, vous devriez trouver le bon commit dans le sous-module - supposons que c'est la pointe du maître:

cd mod
git checkout master
git pull origin master

Revenez maintenant au projet principal, mettez en scène le sous-module et engagez-le:

cd ..
git add mod
git commit -m "Updating the submodule 'mod' to the latest version"

Poussez maintenant votre nouvelle version du projet principal:

git push origin master

À partir de ce moment, si quelqu'un d'autre met à jour son projet principal, alors git submodule update pour eux va mettre à jour le sous-module, en supposant qu'il a été initialisé.


63
2018-04-29 06:12



On dirait que 2 scénarios différents sont mélangés dans cette discussion:

Scénario 1

En utilisant les pointeurs de mon repo parent pour les sous-modules, je veux vérifier le commit dans chaque sous-module, que le repo parent pointe, peut-être après avoir d'abord parcouru tous les sous-modules et les avoir mis à jour.

Ceci est, comme indiqué, fait avec

git submodule foreach git pull origin BRANCH
git submodule update

Scénario 2, je pense que c'est ce que vise le PO

De nouvelles choses se sont produites dans un ou plusieurs sous-modules, et je veux 1) tirer ces changements et 2) mettre à jour le parent repo pour pointer vers la dernière commande HEAD de ce / ces sous-modules.

Cela serait fait par

git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH

Pas très pratique, car vous auriez à coder en dur n chemins vers tous les n sous-modules, par ex. un script pour mettre à jour les pointeurs de validation du référentiel parent.

Ce qui serait cool serait pour une itération automatisée à travers chaque sous-module, mettant à jour le pointeur de repo parent (en utilisant git add) pour pointer vers la tête du sous-module (s).

Pour cela, j'ai fait ce petit script bash:

git-update-submodules.sh


17
2018-01-14 15:46



Simple et simple, pour aller chercher les sous-modules:

git submodule update --init --recursive

et maintenant passez à la dernière branche principale (par exemple):

git submodule foreach git pull origin master

11
2017-08-17 20:48



@Jason est correct d'une certaine manière mais pas entièrement.

mettre à jour

Mettre à jour les sous-modules enregistrés,   c'est-à-dire, cloner des sous-modules manquants et   checkout le commit spécifié dans le   index du référentiel contenant.   Cela fera que les sous-modules HEAD seront   détaché sauf si --rebase ou --merge est   spécifié ou la clé   submodule. $ name.update est défini sur   rebaser ou fusionner.

Donc, la mise à jour de git submodule fait checkout, mais la chose est, c'est à la validation dans l'index du référentiel contenant. Il ne connaît pas encore le nouveau commit en amont. Alors, allez dans votre sous-module, obtenez le commit que vous voulez et validez l'état du sous-module mis à jour dans le repo principal, puis faites le git submodule update


4
2018-04-29 06:01