257 votes

git sous-module mise à jour

Je ne suis pas clair sur ce que les moyens suivants (à partir de git sous-module de mise à jour de documents):

...fera la submodules TÊTE être détachée, à moins d' --rebase ou --merge est spécifié...

Comment est - --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).

À l'intérieur de ces submodules puis-je créer des succursales ou des modifications et de les utiliser push/pull tout comme je serais en repos régulier, ou il y a des choses à être prudent sur l'?
comment avance le 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), ou de choisir les branches s'engager à tous?

319voto

VonC Points 414372

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

Lorsque vous exécutez git submodule update, il vérifie la version spécifique du projet, mais pas à l'intérieur d'une branche. Cela s'appelle avoir un décollement de la tête - la TÊTE de fichier de points directement à la livraison, pas d'une référence symbolique.
Le problème est que vous ne voulez pas travailler dans une maison individuelle à la tête de l'environnement, car il est facile de perdre les modifications.
Si vous faites un premier sous-module de mise à jour, s'engager dans ce sous-module répertoire sans la création d'une branche de travail, puis lancez la commande git sous-module de mise à jour à nouveau à partir de la superproject sans s'engager dans l'intervalle, Git va écraser vos modifications sans vous le dire. Techniquement, vous ne perdrez pas le travail, mais vous n'aurez pas une branche vers celui-ci, de sorte qu'il sera un peu difficile à récupérer.


Note Mars 2013:

Comme mentionné dans "git sous-module de suivi plus tard", un sous-module maintenant (git1.8.2) suivre une direction.
Le reste de cette réponse les détails de la classique de sous-module fonction (référence à un commit).


Pour éviter ce problème, créez une branche lorsque vous travaillez dans un sous-module de répertoire avec la commande git checkout-b de travail ou quelque chose d'équivalent. Lorsque vous faites le sous-module de mise à jour un deuxième temps, il sera toujours revenir à votre travail, mais vous aurez au moins un pointeur de revenir.

La commutation de branches avec des submodules peut aussi être difficile. Si vous créez une nouvelle branche, ajouter un sous-module de là, et puis revenir à une branche sans que le sous-module, vous avez encore le sous-module répertoire comme un sans traces répertoire:


Donc, pour répondre à vos questions:

puis-je créer des succursales ou des modifications et de les utiliser push/pull tout comme je serais en repos régulier, ou il y a des choses à être prudent sur l'?

Vous pouvez créer une branche et de pousser des modifications.

AVERTISSEMENT (à partir 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 sous-module de changement, les autres ne sont pas en mesure de cloner le dépôt.

comment avance le 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)

La page "Comprendre les Submodules" peut aider

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

  • l' .gitmodules le fichier et
  • un type spécial d'objet de l'arborescence.

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.


Depuis le git sous-module de page

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

100% correct: vous ne pouvez pas modifier un sous-module, seulement se référer à l'un de ses commits.

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

  • besoin de s'engager et de pousser à l'intérieur de la sous-module (à l'amont du module), et
  • ensuite, allez dans votre projet principal, et s'engage de nouveau (dans l'ordre pour que le projet principal pour se référer à la nouvelle sous-module s'engager que vous venez de créer et poussé)

Un sous-module vous permet d'avoir une composante de base de l'approche de développement, où le projet principal seulement se réfère à des validations de d'autres composants (ici "autres dépôts Git a déclaré que les sous-modules").

Un sous-module est un marqueur (commit) à un autre dépôt Git qui n'est pas lié par les principaux cycle de développement du projet: (les "autres" repo Git) peuvent évolue de façon indépendante.
C'est le projet principal à choisir que les autres pensions de quoi commettre des besoins.

Cependant, si vous voulez, de commodité, de modifier l'un de ces submodules directement à partir de votre projet principal, Git vous permet de le faire, à condition de la première publication de ces sous-module des modifications à son origine repo Git, et ensuite valider votre projet principal fait référence à une nouvelle version de ladite sous-module.

Mais l'idée principale reste la même: le référencement des composants spécifiques qui:

  • ont leur propre cycle de vie
  • ont leur propre ensemble de balises
  • ont leur propre développement

La liste des changements que vous avez fait référence dans votre projet principal définit votre configuration (c'est ce que la Configuration est la Gestion, qui englobe simple Système de Contrôle de Version)

Si un composant peut vraiment être développé en même temps que votre projet principal (parce que toute modification sur le projet impliquerait la modification de la sous-répertoire, et vice-versa), alors il serait un "sous-module" non plus, mais un sous-arbre de fusion (également présentés dans la question de Transfert de code hérité de la base de cvs à base distribuée), en lien avec l'histoire des deux repo Git ensemble.

Ne fait qu'aider à la compréhension de la véritable nature des Submodules?

139voto

MindTooth Points 1287

Pour mettre à jour chaque sous-module, vous pouvez appeler la commande suivante. (À la racine du repo.)

 git submodule -q foreach git pull -q origin master
 

Vous pouvez supprimer l'option -q pour suivre tout le processus.

19voto

robinspb Points 71

À l'adresse de l' --rebase vs --option fusion:

Disons que vous avez de super-repo et Un sous-module B et voulez faire un peu de travail en sous-module B. Vous avez fait vos devoirs et de savoir qu'après l'appel de

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 en projet Un a décidé que la dernière et meilleure version de B est vraiment ce qu'est Un mérite. Vous, de sortir de l'habitude, de fusionner les modifications les plus récentes vers le bas et de la mise à jour de votre submodules.

<in A>
git merge develop
git submodule update

Oh non! Vous êtes de retour dans une tête de nouveau, probablement parce que le B est maintenant pointant vers le SHA associé à B nouveau conseil, ou d'une autre de commettre. 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é relocalisée sur le nouveau commit, et plus important encore, vous êtes toujours sur votre branche de développement pour B, et non pas dans une tête de l'état!

(le --fusionner fusionner les changements de beforeUpdateSHA à afterUpdateSHA dans votre branche, par opposition à la relocalisation de vos modifications sur afterUpdateSHA. )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X