Aller au contenu
Développement medium

Git bundle : transférer un dépôt hors-ligne

6 min de lecture

git bundle crée un fichier autonome contenant tout ou partie d'un dépôt Git, transférable par clé USB, email ou tout autre moyen hors-ligne. C'est la solution pour les environnements air-gapped, les transferts entre réseaux isolés et les sauvegardes portables. Ce guide vous apprend à créer un bundle, vérifier son contenu et cloner ou puller depuis un bundle, avec un exemple complet de workflow hors-ligne.

Prérequis : Remotes fondamentaux et Sélection de révisions.

  • Créer un bundle complet d'un dépôt pour transfert hors-ligne
  • Créer des bundles incrémentaux pour des mises à jour légères
  • Vérifier l'intégrité d'un bundle avant de l'utiliser
  • Cloner ou puller depuis un fichier bundle
  • Environnement air-gapped : serveurs sans accès internet
  • Transfert entre réseaux : les deux machines ne se voient pas
  • Sauvegarde portable : un fichier unique contenant tout l'historique
  • Bande passante limitée : envoyer un fichier compressé par email
  • Onboarding : donner le repo complet à un nouveau développeur sur clé USB
Fenêtre de terminal
# Bundle contenant TOUT le dépôt (toutes les branches, tous les tags)
git bundle create mon-projet.bundle --all

Le fichier mon-projet.bundle contient l'intégralité du dépôt : tous les commits, branches, tags et objets Git. C'est l'équivalent d'un clone complet dans un fichier unique.

Pour bundler uniquement une branche :

Fenêtre de terminal
git bundle create main-only.bundle main
Fenêtre de terminal
git clone mon-projet.bundle mon-projet
cd mon-projet

Le bundle est traité comme un remote. Après le clone, configurez le vrai remote :

Fenêtre de terminal
git remote set-url origin https://github.com/org/mon-projet.git
Fenêtre de terminal
git remote add usb /media/usb/mon-projet.bundle
git fetch usb
git merge usb/main

Avant d'importer, validez l'intégrité :

Fenêtre de terminal
git bundle verify mon-projet.bundle
The bundle contains these 3 refs:
a1b2c3d4... refs/heads/main
e4f5a6b7... refs/heads/develop
f0e1d2c3... refs/tags/v1.0.0
The bundle records a complete history.
mon-projet.bundle is okay

Si le bundle est incomplet (incrémental), verify indique quels commits pré-requis manquent.

Pour les mises à jour régulières, inutile de re-bundler tout le dépôt. Créez des bundles contenant uniquement les nouveaux commits :

  1. Premier transfert, bundle complet :

    Fenêtre de terminal
    git bundle create initial.bundle --all
    # Notez le dernier commit inclus
    git rev-parse HEAD
    # a1b2c3d4...
  2. Transferts suivants, uniquement les nouveautés :

    Fenêtre de terminal
    # Depuis le dernier commit transféré
    git bundle create update-1.bundle a1b2c3d4..HEAD --all
  3. Sur la machine de destination, appliquer l'incrément :

    Fenêtre de terminal
    git bundle verify update-1.bundle # Vérifier les pré-requis
    git fetch /chemin/update-1.bundle main:remotes/usb/main
    git merge usb/main

Les tags simplifient le suivi des incréments :

Fenêtre de terminal
# Après chaque transfert, tagger le dernier commit envoyé
git tag last-bundle-v1
# Au prochain transfert
git bundle create update.bundle last-bundle-v1..HEAD --all
git tag last-bundle-v2
Machine A (connectée) Clé USB Machine B (isolée)
───────────────────── ──────────── ─────────────────────
git bundle create copier git clone bundle
projet.bundle --all projet.bundle projet
git remote set-url
origin ...
[... plus tard ...]
git bundle create copier git bundle verify
update.bundle update.bundle git fetch update
tag-v1..HEAD --all git merge
git tag tag-v2
Fenêtre de terminal
git bundle list-heads mon-projet.bundle
a1b2c3d4... refs/heads/main
e4f5a6b7... refs/heads/develop
f0e1d2c3... refs/tags/v1.0.0
SymptômeCause probableSolution
verify dit « prerequisite commit missing »Bundle incrémental, historique manquantImportez d'abord le bundle complet
Bundle très volumineuxContient tout l'historique + gros fichiersUtilisez --since ou des plages de commits
clone depuis bundle : remote invalideURL du bundle comme remotegit remote set-url origin <vraie-url>
unbundle ne fait rien de visibleLes objets sont importés mais pas les branchesUtilisez fetch au lieu de unbundle
  • git bundle create empaquète tout ou partie d'un dépôt dans un fichier unique
  • git bundle verify valide l'intégrité avant import
  • Clone ou fetch depuis un bundle comme depuis un remote
  • Les bundles incrémentaux (plage de commits) réduisent la taille des transferts
  • Solution idéale pour les environnements air-gapped et les transferts hors-ligne

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn