Împachetarea și Transferul Depozitelor Offline cu git bundle în Git

Ghid complet pentru comanda git bundle: împachetarea întregului istoric sau a ramurilor selective într-un singur fișier binar pentru transfer securizat în rețele izolate (air-gapped).

Sintaxă comandă
git bundle create proiect.bundle HEAD master | git clone proiect.bundle repo-nou

În mod normal, sincronizarea codului între dezvoltatori se face printr-un server remote (GitHub, GitLab) folosind protocoalele SSH sau HTTPS. Dar ce faci când trebuie să transferi un proiect complet cu tot istoricul său pe o mașină situată într-o rețea militară, bancară sau industrială complet izolată de internet (air-gapped network)? Comanda git bundle împachetează referințele și obiectele Git într-un singur fișier binar compact.

1. Crearea unui pachet bundle complet
# Pe mașina conectată la internet:
# Împachetăm ramura 'main' și tag-urile într-un singur fișier binar:
git bundle create proiect_complet.bundle HEAD main --tags

# Fișierul 'proiect_complet.bundle' este un fișier binar normal pe care îl poți
# copia pe un stick USB securizat sau transfera prin medii izolate!

2. Clonarea și Verificarea Pachetului pe Mașina Destinație

Pe mașina țintă (fără internet), fișierul .bundle poate fi folosit exact ca și cum ar fi un URL de depozit remote:

Clonarea dintr-un fișier bundle
# Pasul 1: Verificăm integritatea pachetului înainte de extragere:
git bundle verify /media/usb/proiect_complet.bundle
# The bundle records a complete history.
# proiect_complet.bundle is okay

# Pasul 2: Clonăm depozitul direct din fișierul bundle:
git clone /media/usb/proiect_complet.bundle /home/user/proiect-local

# Ai un depozit Git complet funcțional, cu tot istoricul de commit-uri!

3. Crearea de Bundle-uri Incrementale (Doar Noutățile)

Dacă proiectul a fost deja clonat pe mașina izolată și doriți să transferați doar commit-urile apărute în ultima lună (fără a retrimite giga-octeți de date):

# Împachetează exclusiv commit-urile mai noi decât tag-ul v1.0.0:
git bundle create actualizare.bundle v1.0.0..main

# Pe mașina izolată, aduceți commit-urile noi prin fetch:
git fetch /media/usb/actualizare.bundle main:main