Comment mettre en place un projet git pour utiliser un sous-module repo externe?

213

Je voudrais créer un dépôt qui tire dans un dépôt distant.

Par exemple, disons jQuery en tant que sous-module:

git://github.com/jquery/jquery.git

Quel serait le processus de création d'un référentiel avec jQuery comme sous-module et l'ajout de mon propre référentiel externe comme référentiel distant.

De plus, une fois que cela est configuré, si je pousse / tire sur ma propre télécommande, l'extérieur restera-t-il intact?

À M
la source
1
Lorsque vous dites "tirer", voulez-vous que le référentiel jQuery soit un sous-module de votre propre référentiel?
ezod
Oui exactement, désolé si ce n'est pas clair. Je voudrais savoir comment je l'ai configuré en tant qu'externe tout en poussant et en tirant les modifications sur ma propre télécommande
Tom
Voir le tutoriel du sous-module Git sur le wiki git.
Greg Bacon

Réponses:

343
  1. Vous avez un projet - appelez-le MyWebApp qui a déjà un dépôt github
  2. Vous souhaitez utiliser le référentiel jquery dans votre projet
  3. Vous souhaitez insérer le dépôt jquery dans votre projet en tant que sous - module .

Les sous-modules sont vraiment, vraiment faciles à référencer et à utiliser. En supposant que MyWebApp soit déjà configuré en tant que dépôt, à partir du terminal, exécutez ces commandes:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Cela va créer un répertoire nommé externals/jquery* et le lier au référentiel github jquery. Il ne nous reste plus qu'à lancer le sous-module et y cloner le code:

git submodule update --init --recursive

Vous devriez maintenant avoir tout le dernier code cloné dans le sous-module. Si le référentiel jquery change et que vous souhaitez extraire le dernier code, submodule updateexécutez à nouveau la commande. Veuillez noter: J'ai généralement un certain nombre de référentiels externes dans mes projets, donc je groupe toujours les référentiels sous un répertoire "externals".

Le livre en ligne Pro Git contient de bonnes informations sur les sous-modules (et git en général) présentés de manière facile à lire. Alternativement, git help submoduledonnera également de bonnes informations. Ou jetez un œil au Tutoriel du sous-module Git sur le wiki git.

J'ai remarqué cette entrée de blog qui parle de sous-modules et les compare au mécanisme svn: externals de Subversion: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* Comme meilleure pratique, vous devez toujours placer vos sous-modules dans leur propre répertoire, comme Externals. Si vous ne le faites pas, votre répertoire de projet racine peut devenir très encombré très rapidement.

memmons
la source
4
Grande explication! :) De plus, "git help submodules" aide si vous voulez un peu plus de détails, internes, etc.
WhyNotHugo
2
Merci, exactement ce dont j'avais besoin.
MikeSchinkel
1
@Chevi Cela dépend de vos besoins. En général, l'ajout d'un projet git en tant que sous-module à votre projet est une bonne solution pour les projets qui changent souvent ou sont encore en développement. Cela vous permet de vous assurer facilement que tout le code tiers de votre projet est à jour. Pour un code tiers qui est essentiellement statique - un code stable et mature qui ne changera probablement pas beaucoup d'une version à l'autre - l'utilisation d'un sous-module ne fournit pas beaucoup de valeur.
memmons
2
désolé mais par rapport aux externes svn, ce n'est pas si facile
Keil
2
@Keil C'est deux commandes, git submodule addet git submodule update... je ne sais pas à quel point cela pourrait être plus facile.
memmons
24

La plupart de ce que vous devez savoir a déjà été répondu, donc je ne vais pas prendre la peine d'y répondre, cependant, j'ai trouvé une petite information qui manque généralement.

Comme vous le savez, "git pull" ne mettra pas à jour les sous-modules, et "git submodules update" ne téléchargera pas non plus la dernière HEAD de ces sous-modules.

Pour mettre à jour tous vos sous-modules à leur dernière révision en amont, vous pouvez utiliser

git submodule foreach git pull

Si vous modifiez souvent vos sous-modules et en avez beaucoup, alors "git foreach" deviendra inestimable.

WhyNotHugo
la source
0

Je pense que la réponse @Hugo pourrait être ce dont vous avez besoin et fonctionne très bien. J'ai donc trouvé un moyen plus simple.

git submodule update --remote

C'est tout.

Un workflow complet pourrait donc être:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Dapaldo
la source