web-dev-qa-db-fra.com

"Git Push --mirror" est-il suffisant pour sauvegarder mon référentiel?

Je suis un développeur solo, travaillant dans un référentiel Git local. Pour les sauvegardes, je souhaite envoyer une copie exacte de ce référentiel à un autre serveur.

Cela suffit-il?

git Push --mirror

Je demande parce que je peux parfois exécuter cette commande deux ou trois fois avant que Git ne me dise "Tout à jour", donc apparemment ce n'est pas un miroir exact. Il semble repousser les branches de suivi ...?

$ git Push --mirror
Counting objects: 42, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (30/30), done.
Writing objects: 100% (30/30), 5.09 KiB, done.
Total 30 (delta 17), reused 0 (delta 0)
To ssh://my/repo/url
   c094a10..0eedc92  mybranch -> mybranch
$ git Push --mirror
Total 0 (delta 0), reused 0 (delta 0)
To ssh://my/repo/url
   c094a10..0eedc92  Origin/mybranch -> Origin/mybranch
$ git Push --mirror
Everything up-to-date

Que se passe-t-il et est-ce une bonne stratégie?

Edit: je n'aime pas utiliser quelque chose comme git bundle ou .tar.bz2 archives, car j'aimerais que la sauvegarde soit une copie de travail accessible. Étant donné que mon serveur de sauvegarde est connecté au net et toujours allumé, c'est une belle façon d'accéder au référentiel lorsque je suis en déplacement.

52
Thomas

Je dirais que c'est une stratégie parfaitement acceptable pour sauvegarder votre référentiel. Il doit effectuer un Push vers votre télécommande d'origine pour chaque référence dans le référentiel. Ce qui en fait un "miroir" complet de votre référentiel local.

EDIT: Je viens de voir votre description mise à jour dans la question. Il semble que git pousse votre télécommande vers la télécommande elle-même avec tout le reste. Une fois le Push terminé, la référence à distance sera mise à jour pour refléter que vous venez de le pousser. Ce sera désormais obsolète avec le référentiel distant, donc une nouvelle poussée est nécessaire. Si cela ne vous satisfait pas. Vous pouvez supprimer cette référence à distance avec

git Push: Origine/mybranch

puis utiliser

git Push --all

rappelez-vous que cela ne poussera pas les nouvelles branches que vous créez.

8
Greg Sexton

La raison pour laquelle vous voyez quelque chose poussé la deuxième fois est que --mirror pousse un peu plus que prévu. Outre vos succursales locales, il pousse également vos succursales distantes, car le miroir implique tout. Ainsi, lorsque vous poussez normalement (ou avec --mirror), mybranch est poussé et Origin/mybranch est mis à jour pour refléter le nouveau statut sur l'origine. Lorsque vous poussez avec --mirror, Origin/mybranch est également poussé.

Cela se traduit par l'étrangeté que vous voyez, et aussi par une étrangeté pire lorsque vous tirez de cette télécommande; vous obtiendrez des branches nommées Origin/origin/mybranch etc. Il est donc généralement préférable d'utiliser --mirror pour des copies uniques, et utilisez simplement Push normal (peut-être avec --all) pour des utilisations normales.

Pour toujours pousser toutes les branches et tous les tags, vous pouvez mettre à jour .git/config ainsi:

[remote "Origin"]
  url = ...
  fetch = ...
  Push = +refs/heads/*
  Push = +refs/tags/*

Cela fera un Push normal similaire à un miroir, sauf qu'il ne supprimera pas les branches qui n'existent pas à la source ou pour les mises à jour non rapides.

31
Jakob Borg

Malheureusement, vous n'en obtenez pas une copie exacte avec Push. Vous perdez votre réserve .

24
nschum

Ce que je fais c'est:

Configurer le référentiel: git clone --mirror user@server:/url-to-repo.git

Ensuite, lorsque vous souhaitez actualiser la sauvegarde: git remote update depuis l'emplacement du clone.

Cela sauvegarde toutes les branches, y compris les nouvelles branches qui seront ajoutées plus tard, bien qu'il soit intéressant de noter que les branches qui sont supprimées ne sont pas supprimées du clone (ce qui, pour une sauvegarde, peut être une bonne chose).

De http://www.garron.me/en/bits/backup-git-bare-repo.html

5
fantabolous

J'utilise habituellement git Push --all. J'utilise uniquement --mirror lorsque j'ai besoin de pousser des branches nouvellement créées ou que j'ai supprimé certaines branches et que je ne veux pas les nommer une par une. Sinon, le Push --all fonctionne généralement selon mes besoins.

4
RaptorX

Dans le même esprit que réponse d'Amber , vous pourriez:

1
VonC

Pourquoi ne pas simplement compresser une copie du .git dossier et l'envoyer à un autre serveur?

0
Amber