Question

J'ai un référentiel de supports 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 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 fais des changements?

Était-ce utile?

La solution

La clé est les sous-modules Git .

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

Disons que vous avez les dépôts 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 l'opération sur l'autre rapport ...

Maintenant, ce qui est bien, c’est que chaque fois que vous validez des modifications dans 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 connaître.

  

L’excellente puissance est l’occasion idéale de se faire mordre à la croupe.

Autres conseils

Envisagez d'utiliser un sous-arbre Au lieu de sous-modules, cela simplifiera considérablement la vie de vos utilisateurs de pensions. Vous trouverez un guide plus détaillé dans le livre Pro Git .

Si je comprends bien votre problème, vous souhaitez les éléments suivants:

  1. Vos fichiers multimédia 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 éviter de valider + push + pull tout le temps)

Malheureusement, il n’existe pas de solution ultime pour ce que vous voulez, mais certaines choses 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 en date 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édias et un pour chaque projet
  2. créez dans vos projets un lien symbolique pointant 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 place les fichiers multimédias.

Toutefois, 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 changer de version de 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. Toutefois, vous disposerez normalement de nombreuses 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 valider, 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 télécommande de cette manière:

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 ultérieurement (avec git reset) car vous ne les avez pas partagés avec d'autres utilisateurs.

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 bogué.

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 en gros, il vous suffit de mklink les deux chemins dans une invite de commande avec privilèges élevés. 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 dupliquée d'un autre message, car ce message était marqué comme une question dupliquée pour celui-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top