57 votes

Sauvegarder un référentiel GitHub

Quelle est la meilleure façon de créer une sauvegarde locale d'un dépôt git hébergé sur GitHub, étant donné les exigences suivantes?:

  1. La sauvegarde locale doit être un nu-repo.

  2. La sauvegarde doit inclure toutes les branches.

  3. Il devrait être facile à (progressivement) mise à jour de la sauvegarde.

En gros, je veux un miroir parfait, avec la possibilité de mettre à jour facilement. En tant que tel, la commande

git clone --mirror git://github.com/...

vient à l'esprit, mais aussi loin que je peux dire, qui n'autorise pas une simple mise à jour (je dois le supprimer et de le recréer ma sauvegarde locale). Aussi, le miroir option pour git clone semble assez récent, je ne l'ai pas sur certains systèmes, je suis en train de travailler sur (qui ont légèrement les anciennes versions de git en cours d'exécution).

Quelle est votre solution recommandée pour ce genre de problème?

49voto

VonC Points 414372

Je ne suis pas sûr qu'il pourrait couvrir tous vos besoins, mais vous pourriez vérifier git bundle

git bundle

Cette commande fournit le support pour l' git fetch et git pull à opérer par l'emballage des objets et des références dans une archive à l'ordinateur d'origine, puis d'importer les dans un autre référentiel à l'aide de git fetch et git pull après le déplacement de l'archive par quelque moyen

Ce que j'aime à propos de cette solution est la seule et unique fichier produit, exactement ce que je veux en elle

git bundle ne paquet de références qui sont indiqués par git-show-ref: cela comprend les chefs, les balises, et à distance de la tête.

machineA$ git bundle create file.bundle master

Remarque: Kent Fredric mentionne dans les commentaires d'une subtilité d' git rev-list:

--all

Faire comme si toutes les refs en $GIT_DIR/refs/ sont listés sur la ligne de commande <commit>.

Il ajoute:

votre ensemble actuel ne bundle parents de la livraison, vous auriez probablement besoin de spécifier --all pour obtenir une série complète de tout (les branches qui sont des descendants de master).

Pour voir la différence:

$ git bundle create /tmp/foo master
$ git bundle create /tmp/foo-all --all
$ git bundle list-heads /tmp/foo
$ git bundle list-heads /tmp/foo-all

45voto

Fernando Correia Points 7410

Pour créer le miroir:

 git clone --mirror git://github.com/user/project.git
 

Mettre à jour:

 cd project.git
git remote update
 

Pour mettre à jour sans changer le répertoire actuel:

 git --git-dir project.git remote update
 

9voto

Kent Fredric Points 35592

mais aussi loin que je peux dire, qui n'autorise pas une simple mise à jour (je dois le supprimer et de le recréer ma sauvegarde locale).

Pas sûr de ce que vous entendez par là, la mise à jour, il devrait être aussi simple que de

git fetch

git clone comme il est censé récupérer toutes les refs/commits qui sont visibles sur la branche distante.

git clone --mirror n'est également pas très différent de git clone --bare [source]

la seule différence est le shorthanded git remote add --mirror

( Voir git help add du comportement différent )

Si vous êtes vraiment inquiet, vous pouvez faire ceci:

git clone --no-hardlinks --mirror $original $dest

Qui ne font rien d'autre que s'ils étaient sur le même système de fichiers, de toute façon.

Et si vous êtes vraiment paranoïaque, vous pouvez tre.(gz|bz2) l'ensemble du répertoire et de retour que vers le haut.

3voto

Si vous avez juste besoin de sauvegarder les référentiels GitHub , vous pouvez jeter un oeil à un simple script Bash.

https://github.com/ptrofimov/github-backup-sh

0voto

Norman Ramsey Points 115730

Ce que vous demandez est assez difficile de le faire en respectant les contraintes de git. Le problème est que ni le clonage, ni chargement sera de vous donner toutes les branches par défaut. Voir cette question:

Pour un exemple de clonage d'un repo avec plusieurs branches, en voici la transcription:

% git clone -o tufts linux.cs.tufts.edu:/r/ghc/git/experimental.git
Initialized empty Git repository in /usr/local/nr/git/ghc/experimental/.git/
% cd experimental/
% git fetch
% git branch -a
* head
  tufts/HEAD
  tufts/experimental
  tufts/head
  tufts/norman
% git branch --track experimental tufts/experimental
Branch experimental set up to track remote branch refs/remotes/tufts/experimental.
% git branch --track norman tufts/norman
   ...

Vous pouvez voir que le clonage chaque branche par programmation va être un peu délicat.

Si github permet d'accéder à rsync ou à l'Unisson, ce sont de meilleurs outils pour le travail. Sinon, vous devrez écrire un peu effrayant scripts...

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