98 votes

Comment organisez-vous les multiples dépôts git, afin que chacun d’eux sont sauvegardées ensemble ?

Avec SVN, j'ai eu un seul gros référentiel je conservés sur un serveur, et vérifié sur quelques machines. Ce fut un très bon système de sauvegarde, et m'a permis de travailler plus facilement sur les machines. J'ai pu commander un projet spécifique, s'engager et il mis à jour le "maître" du projet, ou je pourrais commander la chose entière.

Maintenant, j'ai un tas de dépôts git, pour divers projets, dont plusieurs sont sur github. J'ai également le dépôt SVN je l'ai mentionné, importés via git-svn commande..

En gros, j'aime bien avoir tout mon code (pas seulement des projets, mais au hasard des extraits et des scripts, des choses comme mon CV, les articles que j'ai écrits, les sites web que j'ai fait et ainsi de suite) dans une grande référentiel je peux cloner facilement sur des machines à distance, ou de la mémoire-bâtons/disques durs de sauvegarde.

Le problème est, car il est un repository privé, et git ne pas permettre la vérification d'un dossier spécifique (que je pourrais pousser à github comme un projet distinct, mais les modifications apparaissent dans le maître-repo, et les sous-titres)

J'ai pu utiliser git sous-module du système, mais il n'est pas sur la façon dont je le veux trop (submodules sont des pointeurs vers d'autres référentiels, et n'ont pas vraiment de contenir le code, donc il est inutile pour la sauvegarde)

Actuellement, j'ai un dossier de git-repos (par exemple, ~/code_projects/proj1/.git/ ~/code_projects/proj2/.git/), et après avoir fait des modifications à proj1 je n' git push github, puis je copie les fichiers dans ~/Documents/code/python/projets/proj1/ et de faire un commit unique (au lieu de les nombreuses dans les différents titres). Alors n' git push backupdrive1, git push mymemorystick etc

Donc, la question: Comment faire de votre code personnel et des projets avec les dépôts git, et de les garder synchronisées et sauvegardées?

74voto

Damien Diederen Points 2194

Je serais fortement déconseiller de mettre des données non liées à une Le dépôt Git. La surcharge de la création de nouveaux référentiels, est tout à fait faible, et c'est une fonctionnalité qui permet de garder différentes lignées complètement séparées.

Les combats que l'idée moyen de se retrouver avec des inutilement les enchevêtrements de l'histoire, ce qui rend l'administration plus difficile et, plus important - "archéologie" des outils moins utile en raison du la dilution. Aussi, comme vous l'avez mentionné, Git suppose que l ' "unité de le clonage" est le dépositaire, et pratiquement de a à faire à cause de sa nature distribuée.

Une solution est de garder tous les projets/package/etc. comme son propre nue référentiel (c'est à dire, sans arbre de travail) sous une sainte hiérarchie, comme:

/repos/a.git
/repos/b.git
/repos/c.git

Une fois un peu de conventions ont été établies, il devient trivial de appliquer les opérations d'administration (sauvegarde, d'emballage, de publication web) l'ensemble de la hiérarchie, qui sert un rôle pas entièrement dissemblables à "monolithique" les dépôts SVN. Travailler avec ces référentiels également devient quelque peu semblable à SVN flux de travail, avec en plus un pouvez utiliser les validations et les branches:

svn checkout   --> git clone
svn update     --> git pull
svn commit     --> git push

Vous pouvez avoir plusieurs télécommandes à chaque clone, pour la facilité de la synchronisation entre les multiples parties:

$ cd ~/dev
$ git clone /repos/foo.git       # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...

Vous pouvez alors récupérer/pull de chacun des "sources", de travailler et de s'engager localement, puis push ("backup") à chacun de ces télécommandes lorsque vous êtes prêt avec quelque chose comme (notez que pousse le mêmecommet et l'histoire de chacune des télécommandes!):

$ for remote in origin github memorystick; do git push $remote; done

Le moyen le plus facile de faire tourner un travail existant référentiel ~/dev/foo dans un dépôt nu est probablement:

$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git

ce qui est quasiment équivalent à un svn import- mais ne pas jeter le existant, de "local" de l'histoire.

Remarque: submodules sont un mécanisme permettant d'inclure partagé liées lignées, j'ai donc en effet ne pas considérer un outil approprié pour le problème que vous essayez de résoudre.

28voto

Je veux ajouter à Damien réponse où il recommande:

$ for remote in origin github memorystick; do git push $remote; done

Vous pouvez définir une distance de pousser à tous les vrais télécommandes avec 1 commande; je l'ai trouvé à http://marc.info/?l=git&m=116231242118202&w=2:

Donc, pour "git push" (où il fait sens de pousser les mêmes branches plusieurs fois), vous pouvez réellement faire ce que je fais:

  • .git/config contient:

    [remote "all"]
    url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
    url = login.osdl.org:linux-2.6.git
    
  • et maintenant, git push all master poussera le "maître" de la branche à la fois
    de ces dépôts distants.

Vous pouvez également enregistrer vous-même en tapant l'Url à deux reprises par l'aide de la construction:

[url "<actual url base>"]
    insteadOf = <other url base>

3voto

Spoike Points 32082

Je n'ai pas essayé de nidification des dépôts git encore parce que je n'ai pas dans une situation où j'en ai besoin. Comme je l'ai lu sur le #git canal git semble se confondre par l'imbrication des référentiels, c'est à dire que vous essayez de git-init à l'intérieur d'un dépôt git. La seule manière de gérer un imbriquée git structure est soit d'utiliser git-submodule ou Android repo utilitaire.

Comme pour la sauvegarde de cette responsabilité que vous décrivez je dis délégué ... Pour moi j'ai l'habitude de mettre "à l'origine" référentiel pour chaque projet à un lecteur réseau au travail qui est sauvegardé régulièrement par l'IL-techs par leur stratégie de sauvegarde de votre choix. Il est simple et je n'ai pas à m'en soucier. ;)

3voto

Danny G Points 31

Moi aussi je suis curieux de savoir suggéré des façons de gérer cela et allons décrire la configuration actuelle que j'utilise (avec SVN). J'ai créé une archive qui contient un mini-hiérarchie du système de fichiers, y compris son propre bin et lib dirs. Il y a un script à la racine de cet arbre qui va configurer votre environnement pour ajouter ces bin, lib, etc... d'autres répertoires pour les variables d'environnement appropriées. Si le répertoire racine essentiellement ressemble:

./bin/            # prepended to $PATH
./lib/            # prepended to $LD_LIBRARY_PATH
./lib/python/     # prepended to $PYTHONPATH
./setup_env.bash  # sets up the environment

Maintenant à l'intérieur de /bin et /lib il y a de multiples projets et de leurs bibliothèques correspondantes. Je sais que ce n'est pas un projet standard, mais il est très facile pour quelqu'un d'autre dans mon groupe à la caisse des pensions de titres, exécutez le " setup_env.bash script et le plus à jour des versions de tous les projets à l'échelle locale dans leur caisse. Ils n'ont pas à vous soucier de l'installation/mise à jour /usr/bin ou /usr/lib et il reste simple d'avoir les extractions multiples et très localisée de l'environnement par la caisse. Quelqu'un peut aussi tout simplement rm l'ensemble du référentiel et ne pas s'inquiéter de désinstaller tous les programmes.

Cela fonctionne bien pour nous, et je ne sais pas si nous allons le changer. Le problème, c'est qu'il y a de nombreux projets dans ce grand dépôt. Est-il un git/Hg/bzr niveau moyen de la création d'un tel environnement et de briser les projets dans leurs propres référentiels?

2voto

Que penser de l'utilisation de m. pour la gestion de vos multiples Git repos à la fois:

Le mr(1) de commande peut extraction, mise à jour, ou effectuer d'autres actions sur un ensemble de dépôts comme si elles étaient combinées respository. Il prend en charge n'importe quelle combinaison de subversion, git, cvs, mercurial, bzr, darcs, cvs, vcsh, fossiles et de la véracité des référentiels, et de soutien pour d'autres systèmes de contrôle de révision peuvent être facilement ajoutés. [...]

Il est extrêmement configurable via un simple script shell. Quelques exemples des choses qu'il peut faire:

[...]

  • Lors de la mise à jour d'un dépôt git, tirez à partir de deux différents amonts et de fusionner les deux ensemble.
  • Exécuter plusieurs mises à jour de dépôt en parallèle, ce qui a permis d'accélérer le processus de mise à jour.
  • Rappelez-vous les actions qui ont échoué en raison d'un ordinateur portable est hors ligne, de sorte qu'ils peuvent être retentée lorsqu'il revient en ligne.

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