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?:
La sauvegarde locale doit être un simple dépôt.
La sauvegarde doit inclure toutes les branches.
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?
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
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
etgit 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 degit fetch
etgit 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
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.
Si vous avez juste besoin de sauvegarder les référentiels GitHub , vous pouvez jeter un œil au simple script Bash.
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 ...
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.