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.
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.
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.
Malheureusement, vous n'en obtenez pas une copie exacte avec Push. Vous perdez votre réserve .
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).
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.
Dans le même esprit que réponse d'Amber , vous pourriez:
git bundle
Pourquoi ne pas simplement compresser une copie du .git
dossier et l'envoyer à un autre serveur?