314 votes

Comment travailler avec un dépôt git dans un autre référentiel?

J’ai un dépot de médias Git où je garde tous mes fichiers JavaScript et CSS et les scripts que j’utiliserai sur divers projets.

Si je crée un nouveau projet qui est dans son propre dépôt Git, utilisation de fichiers JavaScript de mon dépot de médias dans mon nouveau projet d’une façon qui le rend donc je n’ai pas de mettre à jour les deux copies du script, quand je fais des changements ?

376voto

gahooa Points 38006

Bonne question. La clé est submodules.

Commencer à lire les Submodules chapitre de l' Git Community Book ou du Manuel de l'utilisateur

Disons que vous avez référentiel PROJET1, PROJECT2, et les MÉDIAS...

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

Répéter l'opération sur l'autre repo...

Maintenant, le truc cool, c'est que tout le temps de valider les modifications de MÉDIAS, vous pouvez faire ceci:

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 les MÉDIAS sous-module DANS PROJECT2 est maintenant à la version XYZ.

Il vous donne le contrôle à 100% de plus que la version des MÉDIAS de chaque projet. submodules sont grands, mais vous avez besoin d'expérimenter et d'apprendre à leur sujet.

Avec un grand pouvoir vient la grande chance de se mordre la queue.

30voto

Ruslan Kabalin Points 1550

Envisagez d’utiliser la sous-arborescence au lieu de sous-modules, il rendra vos utilisateurs repo vie beaucoup plus facile. Vous pouvez trouver le que guide Pro Gitlivre plus détaillé.

20voto

gyim Points 3103

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

  1. Ont vos fichiers multimédias stockés dans un seul dépôt git, qui est utilisé par de nombreux projets
  2. Si vous modifiez un fichier multimédia dans les projets dans votre machine locale, il doit apparaître immédiatement dans tous les autres projets (si vous ne voulez pas commettre+poussoir+tirer tout le temps)

Malheureusement, il n'existe pas de solution ultime pour ce que vous voulez, mais il y a certaines choses par lesquelles vous pouvez faire votre vie plus facile.

D'abord, vous devez décider d'une chose importante: ne vous souhaitez enregistrer pour chaque version de votre dépôt de projet une référence à la version des fichiers de médias? Par exemple, si vous avez un projet appelé example.com, vous avez besoin de savoir quel style.css il a utilisé il y a 2 semaines, ou plus tard, est toujours (ou presque) le meilleur?

Si vous n'avez pas besoin de savoir que la solution est facile:

  1. créer un répertoire pour les fichiers de support et un pour chaque projet
  2. créer un lien symbolique dans vos projets qui point à l'localement cloné médias référentiel. Vous pouvez soit créer une relative lien symbolique (ex: ../médias), et à supposer que tout le monde va checkout du projet afin que le répertoire de médias est à la même place, ou écrire le nom du lien symbolique .gitignore, et tout le monde peut décider de l'endroit où il/elle met les fichiers multimédia.

Dans la plupart des cas, toutefois, vous voulez savoir ce informations de contrôle de version. Dans ce cas, vous avez deux choix:

  1. Magasin chaque projet en un seul référentiel. L'avantage de cette solution est que vous avez seulement 1 copie du dépot de médias. Le gros inconvénient est qu'il est beaucoup plus difficile pour basculer entre les versions d'un projet (si vous commander une version différente vous pourrez toujours modifier TOUS les projets)

  2. Utilisation submodules (comme expliqué dans la réponse 1). De cette façon, vous permettra de stocker les fichiers multimédias dans un référentiel, et les projets ne contient qu'une référence à un média spécifique des pensions de version. Mais de cette façon, vous aurez normalement de nombreuses copies locales des médias référentiel, et vous ne pouvez pas modifier facilement un fichier multimédia dans tous les projets.

Si j'étais vous, je serais probablement choisir la première ou à la troisième solution (liens symboliques ou submodules). Si vous choisissez d'utiliser des submodules vous pouvez encore faire beaucoup de choses pour rendre votre vie plus facile:

  1. Avant de vous engager, vous pouvez renommer le sous-module de répertoire et de mettre un lien vers une commune répertoire de médias. Lorsque vous êtes prêt à s'engager, vous pouvez supprimer le lien symbolique et de supprimer le sous-module de dos, puis de valider.

  2. Vous pouvez ajouter l'un de vos copie du dépot de médias comme un référentiel à distance à l'ensemble de vos projets.

Vous pouvez ajouter des répertoires locaux à distance de cette façon:

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

Si vous modifiez un fichier dans /mon/projet1/media, vous pouvez le valider et de le tirer à partir de /mon/projet2/media sans le pousser à 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 commet plus tard (avec git reset) parce que vous n'avez pas partagé avec d'autres utilisateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X