mise à jour du sous-module git

Je ne sais pas ce que signifie ce qui suit (de git submodule update docs):

...la tête des sous-modules sera détachée, à moins que --rebase ou --merge ne soit spécifié...

Comment --rebase / --merge changer les choses?

Mon principal cas d'utilisation d'un groupe du centre de repos, je vais intégrer via submodules dans d'autres titres. Je voudrais être en mesure d'améliorer ces centrales repos, soit directement dans leur emplacement d'origine, ou de leur intégration repos (utiliser par l'intermédiaire de sous-module).

  • à partir de ces sous-modules, puis-je créer des branches/modifications et utiliser push/pull comme je le ferais dans les repos réguliers, ou y a-t-il des choses à faire avec prudence?
  • Comment faire avancer le sous-module de propagation référencé de say (étiqueté) 1.0 à 1.1 (même si la tête de la mise en pension originale est déjà à 2.0), ou choisir quelle branche de commit est utilisé du tout?
205
demandé sur Jonathan Leffler 2009-12-30 12:02:24

4 réponses

Ce GitPro page n'résumer la conséquence d'un git sous-module de mise à jour joliment

quand vous lancez git submodule update , il vérifie la version spécifique du projet, mais pas dans une branche. Cela s'appelle avoir une tête détachée - cela signifie que la tête du fichier pointe directement vers une propagation, et non vers une référence symbolique.

le problème est que vous ne voulez généralement pas travailler dans un environnement de la tête, parce qu'il est facile de perdre des changements .

Si vous faites une mise à jour initiale de submodule, commit dans ce répertoire submodule sans créer de branche dans laquelle travailler, puis lancez à nouveau la mise à jour de submodule git à partir du superproject sans vous engager dans l'intervalle, Git va écraser vos modifications sans vous en informer. Techniquement, vous ne perdrez pas le travail, mais vous n'aurez pas une branche pointant vers elle, il sera donc un peu difficile à récupérer.


Note Mars 2013:

, Comme mentionné dans " git sous-module de suivi des dernières ", un sous-module maintenant (git1.8.2) suivre une direction.

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

voir " git submodule update --remote vs git pull ".

MindTooth 's réponse illustrent une mise à jour manuelle (sans configuration locale):

git submodule -q foreach git pull -q origin master

dans les deux cas, cela va changer les références submodules (le gitlink , un entrée spéciale dans le parent repo index ), et vous aurez besoin d'ajouter, de commit et de pousser ces références de la principale repo.

La prochaine fois que vous clonerez ce parent repo, il peuplera les sous-modules pour refléter ces nouvelles références SHA1.

le reste de cette réponse détaille la caractéristique classique du sous-module (référence à un fixe commit, qui est le point tout derrière la notion de sous-module).


pour éviter ce problème, créez une branche lorsque vous travaillez dans un répertoire submodule avec le travail git checkout-b ou quelque chose d'équivalent. Quand vous faites la mise à jour du sous-module une deuxième fois, il va toujours revenir à votre travail, mais au moins vous avez un pointeur pour revenir à.

brancher des branches avec des sous-modules peut aussi être délicat. Si vous créez une nouvelle branche, ajoutez un sous-module là, puis revenez à une branche sans ce sous-module, vous avez toujours le répertoire de sous-module comme un répertoire Non suivi:


alors, pour répondre à vos questions:

est-ce que je peux créer des branches/modifications et utiliser push/pull comme je le ferais normalement repos, ou y a-t-il des choses à éviter?

vous pouvez créer une branche et pousser les modifications.

"151960920 d'AVERTISSEMENT" (de Git sous-module Tutoriel ): Toujours publier (push) le sous-module de changement avant de les publier (push) le changement de la superproject la référence. Si vous oubliez de publier le changement de submodule, d'autres ne pourront pas cloner le dépôt.

comment J'avance les sous-module référencé commettre de dire (tagged) 1.0 à 1.1 (même si le chef de l'original de la pension de titres est déjà à 2.0)

de La page " Compréhension Submodules " aide

submodules sont mis en œuvre à l'aide de deux pièces en mouvement:

  • le "151950920 de fichier" et
  • un type spécial d'arbre objet.

Ces ensemble de trianguler une révision spécifique d'un référentiel spécifique qui est vérifié dans un emplacement spécifique dans votre projet.


De la git sous-module page

vous ne pouvez pas modifier le contenu de la sous-module de l'intérieur de l'objectif principal du projet

100% correct: vous ne pouvez pas modifier un sous-module, ne faire référence qu'à l'une de ses commit.

C'est pourquoi, lorsque vous modifiez un sous-module de l'intérieur le projet principal, vous:

  • besoin de commit et push à l'intérieur le sous-module (à l'amont du module), et
  • ensuite, montez dans votre projet principal, et re-commit (afin que ce projet principal se réfère à la nouvelle sous-module commit que vous venez de créer et poussé)

un sous-module vous permet d'avoir une approche basée sur les composants développement, où le projet principal se réfère uniquement aux propagations spécifiques d'autres composants (ici"autres dépôts Git déclarés comme sous-modules").

un sous-module est un marqueur (commit) vers un autre dépôt Git qui n'est pas lié par le cycle de développement du projet principal: il (l '"autre" git repo) peut évoluer indépendamment.

C'est au projet principal de choisir dans cet autre repo tout ce dont il a besoin.

cependant, si vous voulez, hors de convenance , modifier l'un de ces sous-modules directement à partir de votre projet principal, Git vous permet de le faire, à condition que vous premier publier ces modifications de sous-modules à son git repo original, et puis engager votre projet principal se référant à un nouvelle version de ladite sous-module.

mais l'idée principale reste: référencement des composants spécifiques qui:

  • ont leur propre cycle de vie
  • ont leur propre ensemble d'étiquettes
  • ont leur propre développement

la liste des engagements spécifiques auxquels vous faites référence dans votre projet principal définit votre configuration (c'est ce que Configuration la gestion est tout au sujet, englobing simple Version système de contrôle )

si un composant pouvait vraiment être développé en même temps comme votre projet principal (parce que toute modification sur le projet principal impliquerait la modification du sous-répertoire, et vice-versa), alors ce serait un" sous-module " pas plus, mais un sous-Tree fusionner (également présenté dans la question transfert de la base de code d'héritage de cvs au dépôt distribué ), reliant l'histoire des deux git repo ensemble.

est-ce que cela aide à comprendre la vraie nature des sous-Règles de gitan?

265
répondu VonC 2017-12-18 09:06:01

pour mettre À jour chaque sous-module, vous pouvez invoquer la commande suivante. (À la racine du repo.)

git submodule -q foreach git pull -q origin master

vous pouvez supprimer l'option - q pour suivre l'ensemble du processus.

129
répondu MindTooth 2012-02-01 20:46:46

pour l'option -- rebase vs -- merge:

disons que vous avez super-repo A et submodule B et que vous voulez faire un peu de travail dans submodule B. Vous avez fait vos devoirs et savez qu'après avoir appelé

git submodule update

vous êtes dans un TÊTE-moins d'etat, de sorte que tout s'engage à vous faire à ce stade sont dur pour revenir. Donc, vous avez commencé à travailler sur une nouvelle branche dans le sous-module B

cd B
git checkout -b bestIdeaForBEver
<do work>

pendant ce temps, quelqu'un d'autre dans le projet a a décidé que la dernière et plus grande version de B est vraiment ce que A mérite. Vous, par habitude, fusionnez les changements les plus récents et mettez à jour vos sous-modules.

<in A>
git merge develop
git submodule update

Oh noes! Vous êtes de nouveau dans un état sans tête, probablement parce que B pointe maintenant vers le SHA associé à la nouvelle pointe de B, ou un autre commit. Si seulement vous aviez:

git merge develop
git submodule update --rebase

Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437.
Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437'

maintenant que la meilleure idée jamais pour B a été rebasé sur le nouveau s'engager, et plus important encore, vous êtes toujours sur votre branche de développement pour B, pas dans un état sans tête!

(la -- merge va fusionner les changements de beforeUpdateSHA à afterUpdateSHA dans votre branche de travail, au lieu de rebaser vos changements sur afterUpdateSHA. )

17
répondu robinspb 2014-01-25 00:50:07

Git 1.8.2 dispose d'une nouvelle option --remote qui activera exactement ce comportement. En cours d'exécution

git submodule update --rebase --remote

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

--remote

cette option n'est valable que pour la commande update. Au lieu d'utiliser le superproject de l' SHA-1 enregistré pour mettre à jour le sous-module, utilisez l'état de la branche de télésurveillance du sous-module.

cela équivaut à exécuter git pull dans chaque sous-module, ce qui est généralement exactement ce que vous voulez.

(Copié à partir de cette réponse )

4
répondu Iulian Onofrei 2017-12-18 08:50:12