suivi du sous-module git le plus récent

136

Nous déplaçons notre (énorme) projet vers git et nous pensons utiliser des sous-modules. Notre plan est d'avoir trois têtes différentes dans le superprojet: version, stable, dernière. Les chefs de projet géreront la version et les branches stables. Ils déplaceront les sous-modules selon les besoins.

Le problème est la "dernière" tête. Nous aimerions que la tête "dernière" du superprojet suive les branches principales de tous les sous-modules (automatiquement). Et aussi ce serait formidable si cela montrait l'historique de tous les commits au sous-module.

J'ai regardé gitslave, mais ce n'est pas tout à fait ce que nous voulons. Aucune suggestion?

l.thee.a
la source
Alors que vous avez demandé un outil, je veux juste relier cette question qui rassemble des one-liners faisant la même chose: stackoverflow.com/questions/1030169/…
Tobu
Git propose maintenant de suivre les dernières nouvelles avec des sous-modules: voir ma réponse modifiée.
VonC le

Réponses:

235

Mise à jour mars 2013

Git 1.8.2 a ajouté la possibilité de suivre les branches.

" git submodule" a commencé à apprendre un nouveau mode à intégrer avec la pointe de la branche distante (par opposition à l'intégration avec le commit enregistré dans le gitlink du superprojet).

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

# update your submodule
git submodule update --remote 

Si vous aviez déjà un sous-module présent, vous souhaitez maintenant suivre une branche, voir " comment faire en sorte qu'un sous-module existant suit une branche ".

Voir également le tutoriel de Vogella sur les sous-modules pour des informations générales sur les sous-modules.

Remarque:

git submodule add -b . [URL to Git repo];
                    ^^^

Voir la git submodulepage de manuel :

Une valeur spéciale de .est utilisée pour indiquer que le nom de la branche dans le sous-module doit être le même que celui de la branche actuelle dans le référentiel actuel .


Voir commit b928922727d6691a3bdc28160f93f25712c565f6 :

submodule add: Si --branchest donné, enregistrez-le dans.gitmodules

Cela vous permet d'enregistrer facilement une submodule.<name>.branchoption .gitmoduleslorsque vous ajoutez un nouveau sous-module. Avec ce patch,

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

réduit à

$ git submodule add -b <branch> <repository> [<path>]

Cela signifie que les futurs appels à

$ git submodule update --remote ...

obtiendra les mises à jour de la même branche que vous avez utilisée pour initialiser le sous-module, ce qui est généralement ce que vous voulez.

Signé par: W.Trevor King


Réponse originale (février 2012):

Un sous-module est un commit unique référencé par un référentiel parent.
Puisqu'il s'agit d'un dépôt Git en lui-même, «l'historique de tous les commits» est accessible via ungit log dans ce sous-module.

Donc, pour qu'un parent puisse suivre automatiquement le dernier commit d'une branche donnée d'un sous-module, il devrait:

  • cd dans le sous-module
  • git fetch / pull pour s'assurer qu'il a les derniers commits sur la bonne branche
  • cd de retour dans le repo parent
  • add et commit afin d'enregistrer le nouveau commit du sous-module.

gitslave (que vous avez déjà examiné) semble être la meilleure solution, y compris pour l'opération de validation .

Il est un peu ennuyeux d'apporter des modifications au sous-module en raison de la nécessité d'extraire la bonne branche de sous-module, d'effectuer le changement, de valider, puis d'aller dans le superprojet et de valider la validation (ou au moins d'enregistrer le nouvel emplacement du sous-module).

D'autres alternatives sont détaillées ici .

VonC
la source
1
@BraveNewMath dont vous avez besoin à la caisse la branche de droite dans votre sous - module, puis passez à votre pension mère et tapez: git config -f .gitmodules submodule.<path>.branch <branch>. Ajoutez tout, engagez-vous et poussez.
VonC
2
@BraveNewMath Je détaille toutes les étapes pour qu'un sous-module suive une branche dans stackoverflow.com/a/18799234/6309 .
VonC le
1
Il est important d'utiliser la --remotebalise si vous ne voulez pas avoir de tête détachée lorsque vous mettez à jour, en vous demandant pourquoi il semble que votre code fraîchement extrait soit derrière master!
Chris Watts
3
@DC_ Je suis d'accord avec "cette réponse" (depuis que je l'ai écrite). La fonction «suivre une branche» est destinée à mettre à jour un sous-module avec la dernière validation d'une branche. Une fois que cela est fait, vous devrez toujours ajouter et valider le nouvel état de sous-module dans le référentiel parent. Et le prochain clone vérifiera cet état (sans tête).
VonC le
3
@VonC Donc, pour clarifier davantage, la fonctionnalité "suivre une branche" n'affecte que le comportement de la git submodule updatecommande en lui indiquant à quel commit (c'est-à-dire le commit le plus récent sur le maître) mettre à jour le sous-module, sans provoquer automatiquement la mise à jour du dépôt parent. commit est pointé par le sous-module au moment du clonage?
christner