Comment mettre à jour un clone git --mirror?

144

J'ai créé un référentiel git pour mettre en miroir un site en direct (qui est un référentiel git non nu):

git clone --mirror ssh://[email protected]/path/to/repo

Maintenant, pour garder ce clone de miroir à jour avec tous les changements depuis son origine distante, quelle commande ou commandes dois-je utiliser?

J'aimerais que tout soit mis à jour: commits, refs, hooks, branches, etc.

Merci!

J. Bruni
la source

Réponses:

213

Voici la commande que vous devez exécuter sur le miroir:

git remote update
ralphtheninja
la source
@Magnus Skog: Génial. Merci! Est-ce tout? Ai-je besoin d'un autre ordre, comme git fetch? Ou git remote updateseul fera-t-il tout?
J. Bruni
11
J'aimerais aussi savoir quelle est la différence avec git fetch.
Thorbjørn Ravn Andersen
1
@ Thorbjörn (vous devrez faire avec un suédois ö :)): Git fetch met simplement à jour votre référentiel avec des références distantes depuis la télécommande. Cette commande met à jour tout sur le référentiel en miroir.
ralphtheninja
4
Voici une bonne réponse qui explique plus: stackoverflow.com/questions/3959924/…
ralphtheninja
16
'git remote update --prune' fera tout cela, mais supprimera les branches lorsqu'elles sont supprimées du référentiel d'origine.
teeks99
8

Concernant les commits, les refs, les branches et " et cetera ", la réponse Magnus fonctionne juste ( git remote update).

Mais malheureusement, il n'y a aucun moyen de clone/ miroir / update les crochets , comme je le voulais ...

J'ai trouvé ce fil de discussion très intéressant sur le clonage / la mise en miroir des hooks:

http://kerneltrap.org/mailarchive/git/2007/8/28/256180/thread

J'ai appris:

  • Les hooks ne sont pas considérés comme faisant partie du contenu du référentiel.

  • Il y a plus de données, comme le .git/descriptiondossier, qui ne sont pas clonées, tout comme les hooks.

  • Les hooks par défaut qui apparaissent dans le hooksrépertoire proviennent duTEMPLATE_DIR

  • Il y a cette templatefonctionnalité intéressante sur git.

Donc, je peux soit ignorer ce "cloner le truc des hooks", soit opter pour une rsyncstratégie, étant donné les objectifs de mon miroir (sauvegarde + source pour les autres clones, uniquement).

Eh bien ... j'oublierai simplement le clonage des crochets et je m'en tiendrai au git remote updatechemin.

  • Sehe vient de souligner que non seulement les "hooks" ne sont pas gérés par le processus clone/ update, mais aussi les stashes, les rerere, etc ... Donc, pour une sauvegarde stricte, rsyncou équivalent serait vraiment la voie à suivre. Comme ce n'est pas vraiment nécessaire dans mon cas (je peux me permettre de ne pas avoir de crochets, de cachettes, etc.), comme je l'ai dit, je m'en tiendrai au remote update.

Merci! Amélioration un peu de mon propre "git-fu" ... :-)

J. Bruni
la source
5

Voir ici: Git ne clone pas toutes les branches sur les clones suivants?

Si vous voulez vraiment cela en tirant des branches au lieu de push --mirror, vous pouvez jeter un œil ici:

"fetch --all" dans un dépôt nu git ne synchronise pas les branches locales avec les distantes

Cette réponse fournit des étapes détaillées sur la façon d'y parvenir relativement facilement:

sehe
la source
1
pushce n'est pas une option pour moi parce que je dois le faire du côté de la réception (d'où se trouve le clone); pulln'est pas non plus une option car un référentiel miroir est un référentiel nu (pas d'arbre de travail, donc pas de "pull") - il semble qu'en git remote updateeffet tout fasse tout (beaucoup plus facile que la réponse référencée) ... Quoi qu'il en soit, merci! Il y a certainement des informations précieuses dans les questions / réponses liées.
J.Bruni
1
ok, je voulais dire tirer comme dans le langage habituel. Technologie push and pull. Il n'y a guère d'autre mot que le non-sens «obtenir les données d'une télécommande activement chez le client» qui ne doublerait pas un mot qui a un sens pour les systèmes git ou DVCS :) Le deuxième lien fournira les détails que vous voulez. Notez que « la mise à jour à distance git » ne pas état de fait maintenir le « miroir » sans les opérations supplémentaires mentionnées là
sehe
1
hmm ... désolé (HTH) - il semble qu'un miroir "absolu" se réalise plus facilement grâce à un simple "rsync" du dossier repo original ... pas ce que je voulais, mais .. je viens de faire quelques tests ... et rien ne semble copier les crochets - qui m'intéressent particulièrement ...
J. Bruni
1
Pour info, les objectifs de ce miroir sont les suivants: 1) sauvegarde complète à partir de laquelle je peux restaurer si les données du serveur de dépôt d'origine sont perdues; 2) quelque part d'où d'autres peuvent cloner et obtenir un dépôt local de travail, sans avoir accès au dépôt source d'origine
J. Bruni
1
Si vous voulez des crochets et tout, la gitose pourrait (je ne me souviens pas bien) avoir ce dont vous avez besoin, mais j'irais avec rsyncdans ce cas. De plus, je suppose que vous oubliez les cachettes (voir ici ) et que vous recréez des informations aussi ...?
sehe