web-dev-qa-db-fra.com

Sauvegarder un référentiel GitHub

Quelle est la meilleure façon de créer une sauvegarde locale d'un référentiel git hébergé sur GitHub, compte tenu des exigences suivantes?:

  1. La sauvegarde locale doit être un simple dépôt.

  2. La sauvegarde doit inclure toutes les branches.

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

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

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

vient à l'esprit, mais pour autant que je sache, cela ne permet pas une mise à jour facile (je devrais supprimer et recréer ma sauvegarde locale). De plus, l'option miroir pour git clone semble assez récente, je ne l'ai pas sur certains des systèmes sur lesquels je travaille (qui ont des versions légèrement plus anciennes de git en cours d'exécution).

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

56
Michael Goerz

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 modifier le répertoire actuel:

git --git-dir project.git remote update
43
Fernando Correia

Je ne suis pas sûr que cela puisse couvrir toutes vos exigences, mais vous pouvez vérifier git bundle

git bundle

Cette commande prend en charge git fetch et git pull pour fonctionner en empaquetant les objets et les références dans une archive sur la machine d'origine, puis en les important dans un autre référentiel à l'aide de git fetch et git pull après avoir déplacé l'archive par certains moyens

Ce que j'aime dans cette solution, c'est le fichier unique produit, avec exactement ce que je veux

git bundle ne regroupera que les références affichées par git-show-ref: cela inclut les têtes, les balises et les têtes distantes.

machineA$ git bundle create file.bundle master

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

--all

Imaginez comme si toutes les références dans $GIT_DIR/refs/ sont répertoriés sur la ligne de commande sous la forme <commit>.

Il ajoute:

votre bundle actuel ne regroupera que les parents du commit, vous devrez probablement spécifier --all pour obtenir un ensemble complet de tout (branches qui sont descendantes du maître).

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
46
VonC

mais pour autant que je sache, cela ne permet pas une mise à jour facile (je devrais supprimer et recréer ma sauvegarde locale).

Vous ne savez pas ce que vous entendez par là, la mise à jour devrait être aussi simple que

git fetch

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

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

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

(Voir git help add pour les différents comportements)

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

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

Ce qui ne fera rien de différent s'ils étaient de toute façon sur le même système de fichiers.

Et si vous êtes vraiment paranoïaque, vous pouvez tarer (gz | bz2) tout le répertoire et revenir qui vers le haut.

9
Kent Fredric

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

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

3
Renato Cuccinotto

Ce que vous demandez est assez difficile à faire dans les limites de git. Le problème est que ni le clonage ni l'extraction ne vous donneront toutes les branches par défaut. Voir cette question:

Pour un exemple de clonage d'un dépôt avec plusieurs branches, voici une 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 de chaque branche par programme va être un peu délicat.

Si github donne accès à rsync ou nison ce sont de meilleurs outils pour le travail. Sinon, vous devrez écrire des scripts effrayants ...

0
Norman Ramsey

J'ai écrit un script Ruby avec l'aide de quelques autres:

https://github.com/walterjwhite/project.configuration/blob/master/scripts/github.com.backup.Ruby

Ce script me permet de télécharger tous mes référentiels. Je l'utilise pour faire périodiquement une sauvegarde des projets sur lesquels je travaille.

J'espère que cela vous aide, n'hésitez pas à le modifier. Je pense qu'il a un bug, parfois, GitHub expire et le script ne gère pas cela.

0
Walter White