Existe-t-il un moyen simple de sauvegarder un référentiel git complet, y compris toutes les branches et balises?
Existe-t-il un moyen simple de sauvegarder un référentiel git complet, y compris toutes les branches et balises?
Réponses:
Pourquoi ne pas en faire un clone?
git clone --mirror other/repo.git
Chaque référentiel est une sauvegarde de sa télécommande.
git branch -a
. C'est peut-être plus évident de cette façon: après avoir cloné un référentiel, vous ne récupérez pas toutes les branches, vous récupérez chaque commit. Les branches ne font référence qu'à un commit existant.
git clone
couvre tout cela. (1) est facultatif et non obligatoire. Si le résultat est toujours optimisé, c'est quand même une sauvegarde (2) est déjà couverte par git lui-même. - Le point que je voudrais donner est, que si git clone
déjà couvrir les points pertinents, pour quoi vous avez besoin d'un outil différent? Bien que je préfère aussi, git bundle
je ne pense pas que ma réponse soit fausse ou invalide. Vous pouvez voir les deux approches comme une sauvegarde à chaud ou à froid.
git bundle
J'aime cette méthode, car elle ne génère qu'un seul fichier, plus facile à copier.
Voir ProGit: petit paquet de joie .
Voir aussi « Comment puis-je envoyer un e-mail à quelqu'un dans un référentiel git? », Où la commande
git bundle create /tmp/foo-all --all
est détaillé:
git bundle
ne contiendra que les références affichées par git show-ref : cela inclut les têtes, les balises et les têtes distantes.
Il est très important que la base utilisée soit détenue par la destination.
Il est normal de faire preuve de prudence, car le fichier bundle contient des objets déjà dans la destination, car ceux-ci sont ignorés lors de la décompression à la destination.
Pour utiliser ce bundle, vous pouvez le cloner, en spécifiant un dossier inexistant (en dehors de tout dépôt git):
git clone /tmp/foo-all newFolder
git bundle
la bonne réponse à mon avis, et non celle acceptée. Je pense qu'il connaît bien la commande clone, s'il peut poser une telle question, et ce n'est clairement pas suffisant pour lui (car c'est un clone, et non un dump). Les vidages sont des choses différentes comme de simples copies, par exemple: 1) ils ne sont pas nécessaires pour être optimaux (ou même capables) pour un travail normal 2) mais ils doivent avoir une bonne résistance et réparabilité contre la corruption des données 3) C'est souvent utile s'ils sont facilement différents pour les sauvegardes incrémentielles, alors que ce n'est pas un objectif sur les copies.
git bundle
ni git clone
obtient tout , par exemple les scripts hook.
git bundle
contre un dépôt distant?
En développant d'autres réponses, voici ce que je fais:
Configurez le dépôt: git clone --mirror user@server:/url-to-repo.git
Ensuite, lorsque vous souhaitez actualiser la sauvegarde: git remote update
partir de l'emplacement de clonage.
Cela sauvegarde toutes les branches et balises, y compris les nouvelles qui sont ajoutées plus tard, bien qu'il soit intéressant de noter que les branches supprimées ne sont pas supprimées du clone (ce qui peut être une bonne chose pour une sauvegarde).
Ceci est atomique et n'a donc pas les problèmes qu'une simple copie aurait.
Développant les excellentes réponses de KingCrunch et VonC
J'ai combiné les deux:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Après cela, vous avez un fichier appelé reponame.bundle
qui peut être facilement copié. Vous pouvez ensuite créer un nouveau référentiel git normal à partir de celui-ci en utilisantgit clone reponame.bundle reponame
.
Notez que git bundle
seules les copies des commits menant à une référence (branche ou balise) dans le référentiel. Les commits enchevêtrés ne sont donc pas stockés dans le bundle.
git bundle create reponame.bundle --all
?
Tout est contenu dans le .git
répertoire. Sauvegardez simplement cela avec votre projet comme vous le feriez pour n'importe quel fichier.
copy
ou cp
et que cela ne répond pas à ses besoins. Et je pense aussi qu'il pense à un référentiel nu (bien qu'il puisse également être copié, je pense que ce n'est pas une sauvegarde complète).
utiliser git bundle ou clone
copier le répertoire git n'est pas une bonne solution car ce n'est pas atomique. Si vous avez un référentiel volumineux dont la copie prend beaucoup de temps et que quelqu'un le pousse vers votre référentiel, cela affectera votre sauvegarde. Le clonage ou la création d'un bundle n'aura pas ce problème.
Vous pouvez sauvegarder le référentiel git avec git-copy à une taille de stockage minimale.
git copy /path/to/project /backup/project.repo.backup
Ensuite, vous pouvez restaurer votre projet avec git clone
git clone /backup/project.repo.backup project
git clone --bare
+ git push --force
.
La bonne réponse IMO est git clone --mirror . Cela sauvegardera entièrement votre dépôt.
Le miroir de clonage Git clonera le référentiel entier, les notes, les headers, les refs, etc. et est généralement utilisé pour copier un référentiel entier sur un nouveau serveur git. Cela déroulez un toutes les branches et tout, l' ensemble du référentiel.
git clone --mirror git@example.com/your-repo.git
Normalement, le clonage d'un dépôt n'inclut pas toutes les branches, uniquement Master.
Copier le dossier de dépôt ne "copiera" que les branches qui ont été extraites ... donc par défaut c'est la branche principale uniquement ou d'autres branches que vous avez extraites précédemment.
La commande Git bundle n'est pas non plus ce que vous voulez: "La commande bundle va empaqueter tout ce qui serait normalement poussé sur le câble avec une commande git push dans un fichier binaire que vous pouvez envoyer par e-mail à quelqu'un ou mettre sur un lecteur flash, puis dégrouper dans un autre référentiel. " (De Quelle est la différence entre git clone --mirror et git clone --bare )
Ce fil de discussion a été très utile pour obtenir des informations sur la manière dont les sauvegardes des dépôts git pouvaient être effectuées. Je pense qu'il manque encore quelques indices, informations ou conclusions pour trouver la "bonne voie" (tm) pour soi-même. Par conséquent, partager mes pensées ici pour aider les autres et les mettre en discussion pour les améliorer. Merci.
Commençons donc par reprendre la question initiale:
Puis l'enrichissant avec les souhaits typiques et en spécifiant quelques préréglages:
Le point de vue diffère sur ce qu'est une sauvegarde «100%». En voici deux typiques.
git est un outil de développement et prend en charge ce point de vue via git clone --mirror
etgit bundle --all
.
git gc
)git est un outil de développement et laisse cela à l'administrateur. La sauvegarde de la configuration git et de la configuration du système d'exploitation doit être considérée comme séparée de la sauvegarde du contenu.
La plupart d'entre eux sont génériques pour les sauvegardes.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Une sauvegarde par copie froide peut toujours faire une sauvegarde de fichier complète: refuser tous les accès aux dépôts git, faire une sauvegarde et autoriser à nouveau les accès.
Les sauvegardes de fichiers ne peuvent pas être effectuées avec des dépôts actifs en raison du risque de corruption des données par des validations en cours. Une copie à chaud fournit un état fixe d'un référentiel actif à des fins de sauvegarde. Les validations en cours n'affectent pas cette copie. Comme indiqué ci-dessus, les fonctionnalités de clone et de bundle de git prennent en charge cela, mais pour une sauvegarde "100% admin", plusieurs choses doivent être effectuées via des commandes supplémentaires.
git bundle --all
pour créer des fichiers de vidage complets / incrémentiels du contenu et copier / sauvegarder les fichiers de configuration séparément.git clone --mirror
, gérez et copiez la configuration séparément, puis effectuez une sauvegarde complète des fichiers du miroir.
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
cela crée une sauvegarde et effectue la configuration, de sorte que vous puissiez faire un push git pour mettre à jour votre sauvegarde, ce que vous voulez probablement faire. Assurez-vous simplement que / path / to / backupdir et / path / to / repo sont au moins des disques durs différents, sinon cela n'a pas beaucoup de sens de le faire.
Voici deux options:
Vous pouvez directement prendre un tar du répertoire git repo car il contient tout le contenu nu du repo sur le serveur. Il y a une légère possibilité que quelqu'un travaille sur le repo tout en prenant une sauvegarde.
La commande suivante vous donnera le clone nu du repo (tout comme il est dans le serveur), puis vous pouvez prendre un tar de l'emplacement où vous avez cloné sans aucun problème.
git clone --bare {your backup local repo} {new location where you want to clone}
Autant que je sache, vous pouvez simplement faire une copie du répertoire dans lequel se trouve votre dépôt, c'est tout!
cp -r project project-backup
git clone --bare
vous donnera un instantané cohérent.