web-dev-qa-db-fra.com

Comment "commettre" des modifications dans un sous-module git?

Dans ma naïveté, j’ai mis en place un sous-module git et je l’ai traité comme un externe Subversion - c’est-à-dire qu’il est maintenant rempli de changements que je viens de réaliser et qui n’ont pas été engagés ou poussés nulle part.

Existe-t-il un moyen simple de valider/de transférer les modifications du sous-module dans le référentiel en amont? Et quelle est la technique recommandée dans Git pour effectuer un développement simultané sur des référentiels distincts (mais liés) de cette manière?

230
Dylan Beattie

Un sous-module est son propre repo/work-area , avec son propre répertoire .git.

Donc, d'abord commit/Push votre sous-module change:

$ cd path/to/submodule
$ git add <stuff>
$ git commit -m "comment"
$ git Push

Ensuite, mettez à jour votre projet principal pour suivre la version mise à jour du sous-module :

$ cd /main/project
$ git add path/to/submodule
$ git commit -m "updated my submodule"
$ git Push
366
timdev

Notez que si vous avez validé de nombreux changements dans différents sous-modules, vous pouvez (ou pourrez bientôt le faire) Mettez tout en un (c'est-à-dire un push du référent parent), avec:

_git Push --recurse-submodules=on-demand
_

git1.7.11 ( [ANNOUNCE] Git 1.7.11.rc1 ) mentionne:

"_git Push --recurse-submodules_" a appris à consulter éventuellement les historiques des sous-modules liés au superprojet et à les repousser.

Probablement fait après ce correctif et l'option --on-demand:

_--recurse-submodules=<check|on-demand|no>::
_

Assurez-vous que tous les commits de sous-module utilisés par les révisions à pousser sont disponibles sur une branche de suivi distante.

  • Si check est utilisé, il sera vérifié que toutes les validations de sous-module modifiées dans les révisions à pousser sont disponibles sur une télécommande.
    Sinon, le Push sera abandonné et sortira avec un statut différent de zéro.
  • Si _on-demand_ est utilisé, tous les sous-modules qui ont été modifiés dans les révisions à pousser seront poussés.
    Si à la demande n'était pas en mesure de pousser toutes les révisions nécessaires, il sera également abandonné et sortira avec un statut différent de zéro.

Cette option ne fonctionne que pour un niveau d'imbrication. Les modifications apportées au sous-module à l'intérieur d'un autre sous-module ne seront pas appliquées.

52
VonC
$ git submodule status --recursive

Est également un épargnant de vie dans cette situation. Vous pouvez l'utiliser et gitk --all pour garder une trace de vos sha1 et vérifier que vos sous-modules pointent vers ce que vous pensez qu'ils sont.

7
rahvin_t

Vous pouvez traiter un sous-module exactement comme un référentiel ordinaire. Pour propager vos modifications en amont, il suffit de valider et de pousser comme vous le feriez normalement dans ce répertoire.

5
nickgrim

Avant de pouvoir valider et Push, vous devez initialiser une arborescence de référentiel fonctionnelle pour un sous-module. J'utilise la tortue et fais les choses suivantes:

Commencez par vérifier s’il existe un fichier .git (pas un répertoire)

  • s'il existe un tel fichier, il contient le chemin du répertoire supermodule git
  • supprimer ce fichier
  • faire git init
  • est-ce que git ajoute le chemin distant celui utilisé pour le sous-module
  • suivez les instructions ci-dessous

S'il y avait un fichier .git, il y avait sûrement un répertoire .git qui surveille l'arborescence locale. Vous devez toujours créer une branche (vous pouvez en créer une) ou passer en mode maître (ce qui ne fonctionne parfois pas). Le mieux est de - git fetch - git pull. Ne pas omettre de chercher.

Maintenant, vos commits et tirages seront synchronisés avec votre origine/maître

2
fantastory