web-dev-qa-db-fra.com

Comment travailler avec un référentiel git dans un autre référentiel?

J'ai un référentiel de médias Git dans lequel je conserve tous mes fichiers maîtres et scripts JavaScript et CSS que je vais utiliser dans différents projets.

Si je crée un nouveau projet qui se trouve dans son propre référentiel Git, comment puis-je utiliser les fichiers JavaScript de mon référentiel de supports dans mon nouveau projet de manière à ne pas avoir à mettre à jour les deux copies du script lorsque je modifie ?

260
Brent O'Connor

La clé est les sous-modules git .

Commencez à lire le chapitre Sous-modules du Livre de la communauté Git ou du Manuel de l'utilisateur

Supposons que vous ayez les référentiels PROJECT1, PROJECT2 et MEDIA ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

Répétez sur l'autre repo ...

Ce qui est bien, c’est que chaque fois que vous apportez des modifications à MEDIA, vous pouvez le faire:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

Cela vient d’enregistrer le fait que le sous-module MEDIA WITHIN PROJECT2 est maintenant à la version XYZ.

Cela vous donne un contrôle à 100% sur la version de MEDIA utilisée par chaque projet. Les sous-modules git sont excellents, mais vous devez les expérimenter et les apprendre.

Avec une grande puissance vient la grande chance de se faire mordre à la croupe.

329
gahooa

Pensez à utiliser subtree à la place des sous-modules, cela facilitera considérablement la vie de vos utilisateurs de pensions. Vous pouvez trouver un guide plus détaillé dans livre Pro Git .

24
Ruslan Kabalin

Si je comprends bien votre problème, vous voulez les choses suivantes:

  1. Vos fichiers multimédias sont stockés dans un seul référentiel git, utilisé par de nombreux projets.
  2. Si vous modifiez un fichier multimédia dans l'un des projets de votre ordinateur local, il doit apparaître immédiatement dans tous les autres projets (pour que vous ne souhaitiez pas valider + Push + Pull tout le temps).

Malheureusement, il n'y a pas de solution ultime pour ce que vous voulez, mais il y a certaines choses qui peuvent vous faciliter la vie.

Tout d’abord, vous devez décider d’une chose importante: voulez-vous stocker pour chaque version du référentiel de votre projet une référence à la version des fichiers multimédias? Ainsi, par exemple, si vous avez un projet appelé exemple.com, avez-vous besoin de savoir quel style.css il utilisait il y a 2 semaines, ou le dernier est-il toujours (ou surtout) le meilleur?

Si vous n'avez pas besoin de savoir cela, la solution est simple:

  1. créer un référentiel pour les fichiers multimédia et un pour chaque projet
  2. créez un lien symbolique dans vos projets qui pointe vers le référentiel de supports cloné localement. Vous pouvez soit créer un lien symbolique relatif (par exemple, ../media) et supposer que tout le monde récupérera le projet afin que le répertoire multimédia se trouve au même endroit, ou écrire le nom du lien symbolique dans .gitignore, afin que chacun puisse décider. où il/elle met les fichiers multimédias.

Cependant, dans la plupart des cas, vous souhaitez connaître ces informations de gestion des versions. Dans ce cas, vous avez deux choix:

  1. Stockez chaque projet dans un grand référentiel. L'avantage de cette solution est que vous ne disposez que d'une copie du référentiel de supports. Le gros inconvénient est qu'il est beaucoup plus difficile de passer d'une version à l'autre du projet (si vous passez à une version différente, vous modifierez toujours TOUS les projets).

  2. Utilisez des sous-modules (comme expliqué à la réponse 1). De cette manière, vous stockerez les fichiers multimédia dans un référentiel et les projets ne contiendront qu'une référence à une version spécifique du référentiel multimédia. Mais de cette manière, vous aurez normalement plusieurs copies locales du référentiel de supports et vous ne pourrez pas modifier facilement un fichier de support dans tous les projets.

Si j'étais vous, je choisirais probablement la première ou la troisième solution (liens symboliques ou sous-modules). Si vous choisissez d'utiliser des sous-modules, vous pouvez toujours faire beaucoup de choses pour vous simplifier la vie:

  1. Avant de vous engager, vous pouvez renommer le répertoire du sous-module et placer un lien symbolique vers un répertoire multimédia commun. Lorsque vous êtes prêt à valider, vous pouvez supprimer le lien symbolique et supprimer le sous-module, puis valider.

  2. Vous pouvez ajouter une de vos copies du référentiel de supports en tant que référentiel distant à tous vos projets.

Vous pouvez ajouter des répertoires locaux comme une télécommande de cette façon:

cd /my/project2/media
git remote add project1 /my/project1/media

Si vous modifiez un fichier dans/my/project1/media, vous pouvez le valider et l'extraire de/my/project2/media sans le transférer sur un serveur distant:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

Vous êtes libre de supprimer ces commits plus tard (avec git reset) car vous ne les avez pas partagés avec d'autres utilisateurs.

20
gyim

J'ai eu des problèmes avec les sous-arbres et les sous-modules que les autres réponses suggèrent ... principalement parce que j'utilise SourceTree et que cela semble assez buggy.

Au lieu de cela, j'ai fini par utiliser SymLinks et cela semble bien fonctionner, alors je le publie ici comme alternative possible.

Il existe un guide complet ici: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Mais fondamentalement, il vous suffit de mklink les deux chemins dans une invite de commande élevée. Assurez-vous que vous utilisez le préfixe de lien physique/J. Quelque chose du genre: mklink/J C:\projects\MainProject\plugins C:\projects\SomePlugin

Vous pouvez également utiliser des chemins de dossier relatifs et les définir en une fois pour que chaque personne puisse l'exécuter lors de la première extraction de votre projet.

Exemple: mklink/J.\Assets\TaqtileTools ..\TaqtileHoloTools

Une fois le dossier lié, vous devrez peut-être ignorer le dossier de votre référentiel principal qui le référence. Sinon, vous êtes prêt à partir.

Remarque J'ai supprimé ma réponse en double d'un autre message, car cet article était marqué comme une question en double pour celui-ci.

2
ickydime