-
1. DĂ©marrage rapide
-
2. Les bases de Git
-
3. Les branches avec Git
-
4. Git sur le serveur
- 4.1 Protocoles
- 4.2 Installation de Git sur un serveur
- 4.3 Génération des clés publiques SSH
- 4.4 Mise en place du serveur
- 4.5 DĂ©mon (Daemon) Git
- 4.6 HTTP intelligent
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Git hébergé
- 4.10 Résumé
-
5. Git distribué
-
6. GitHub
-
7. Utilitaires Git
- 7.1 SĂ©lection des versions
- 7.2 Indexation interactive
- 7.3 Remisage et nettoyage
- 7.4 Signer votre travail
- 7.5 Recherche
- 7.6 RĂ©Ă©crire lâhistorique
- 7.7 Reset démystifié
- 7.8 Fusion avancée
- 7.9 Rerere
- 7.10 DĂ©boguer avec Git
- 7.11 Sous-modules
- 7.12 Empaquetage (bundling)
- 7.13 Replace
- 7.14 Stockage des identifiants
- 7.15 Résumé
-
8. Personnalisation de Git
- 8.1 Configuration de Git
- 8.2 Attributs Git
- 8.3 Crochets Git
- 8.4 Exemple de politique gérée par Git
- 8.5 Résumé
-
9. Git et les autres systĂšmes
- 9.1 Git comme client
- 9.2 Migration vers Git
- 9.3 Résumé
-
10. Les tripes de Git
- 10.1 Plomberie et porcelaine
- 10.2 Les objets de Git
- 10.3 Références Git
- 10.4 Fichiers groupés
- 10.5 La refspec
- 10.6 Les protocoles de transfert
- 10.7 Maintenance et récupération de données
- 10.8 Les variables dâenvironnement
- 10.9 Résumé
-
A1. Annexe A: Git dans dâautres environnements
- A1.1 Interfaces graphiques
- A1.2 Git dans Visual Studio
- A1.3 Git dans Visual Studio Code
- A1.4 Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git dans Sublime Text
- A1.6 Git dans Bash
- A1.7 Git dans Zsh
- A1.8 Git dans PowerShell
- A1.9 Résumé
-
A2. Annexe B: Embarquer Git dans vos applications
- A2.1 Git en ligne de commande
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Commandes Git
- A3.1 Installation et configuration
- A3.2 Obtention et création des projets
- A3.3 Capture dâinstantanĂ© basique
- A3.4 Création de branches et fusion
- A3.5 Partage et mise Ă jour de projets
- A3.6 Inspection et comparaison
- A3.7 DĂ©bogage
- A3.8 Patchs
- A3.9 Courriel
- A3.10 SystĂšmes externes
- A3.11 Administration
- A3.12 Commandes de plomberie
7.12 Utilitaires Git - Empaquetage (bundling)
Empaquetage (bundling)
Bien que nous ayons dĂ©jĂ abordĂ© les mĂ©thodes les plus communes de transfert de donnĂ©es Git par rĂ©seau (HTTP, SSH, etc.), il existe en fait une mĂ©thode supplĂ©mentaire qui nâest pas beaucoup utilisĂ©e mais qui peut sâavĂ©rer utile.
Git est capable dâempaqueter ses donnĂ©es dans un fichier unique.
Ceci peut servir dans de nombreux scénarios.
Le rĂ©seau peut ĂȘtre en panne et vous souhaitez envoyer des modifications Ă vos collĂšgues.
Peut-ĂȘtre ĂȘtes-vous en train de travailler Ă distance et vous ne pouvez pas vous connecter au rĂ©seau local pour des raisons de sĂ©curitĂ©.
Peut-ĂȘtre que votre carte rĂ©seau ou votre carte wifi vient de tomber en panne.
Peut-ĂȘtre encore nâavez-vous pas accĂšs Ă un serveur partagĂ©, et vous souhaitez envoyer Ă quelquâun des mises Ă jour sans devoir transfĂ©rer 40 commits via format-patch
.
Ce sont des situations oĂč la commande git bundle
est utile.
La commande bundle
va empaqueter tout ce qui serait normalement poussé sur le réseau avec une commande git push
dans un fichier binaire qui peut ĂȘtre envoyĂ© Ă quelquâun par courriel ou copiĂ© sur une clĂ© USB, puis de le dĂ©paqueter dans un autre dĂ©pĂŽt.
Voyons un exemple simple. Supposons que vous avez un dépÎt avec deux commits :
$ git log
commit 9a466c572fe88b195efd356c3f2bbeccdb504102
Author: Scott Chacon <schacon@gmail.com>
Date: Wed Mar 10 07:34:10 2010 -0800
second commit
commit b1ec3248f39900d2a406049d762aa68e9641be25
Author: Scott Chacon <schacon@gmail.com>
Date: Wed Mar 10 07:34:01 2010 -0800
first commit
Si vous souhaitez envoyer ce dĂ©pĂŽt Ă quelquâun et que vous nâavez pas accĂšs en poussĂ©e Ă un dĂ©pĂŽt, ou que simplement vous ne voulez pas en crĂ©er un, vous pouvez lâempaqueter avec git bundle create
.
$ git bundle create repo.bundle HEAD master
DĂ©compte des objets: 6, fait.
Delta compression using up to 2 threads.
Compression des objets: 100% (2/2), fait.
Ăcriture des objets : 100% (6/6), 441 bytes, fait.
Total 6 (delta 0), reused 0 (delta 0)
à présent, vous avez un fichier repo.bundle
qui contient toutes les données nécessaires pour recréer la branche master
du dépÎt.
Avec la commande bundle
, vous devez lister toutes les références ou les intervalles spécifiques de commits que vous voulez inclure.
Si vous le destinez Ă ĂȘtre clonĂ© ailleurs, vous devriez aussi ajouter HEAD comme rĂ©fĂ©rence, comme nous lâavons fait.
Vous pouvez envoyer ce fichier repo.bundle
par courriel, ou le copier sur une clé USB et la tendre à un collÚgue.
De lâautre cĂŽtĂ©, supposons quâon vous a envoyĂ© ce fichier repo.bundle
et que vous voulez travailler sur le projet.
Vous pouvez cloner le fichier binaire dans un rĂ©pertoire, de la mĂȘme maniĂšre que vous le feriez pour une URL.
$ git clone repo.bundle repo
Initialized empty Git repository in /private/tmp/bundle/repo/.git/
$ cd repo
$ git log --oneline
9a466c5 second commit
b1ec324 first commit
Si vous nâincluez pas HEAD dans les rĂ©fĂ©rences, vous devez aussi spĂ©cifier -b master
ou nâimporte quelle branche incluse dans le paquet car sinon, il ne saura pas quelle branche extraire.
Maintenant, supposons que vous faites 3 commits et que vous voulez renvoyer ces nouveaux commits via courriel ou clé USB.
$ git log --oneline
71b84da last commit - second repo
c99cf5b fourth commit - second repo
7011d3d third commit - second repo
9a466c5 second commit
b1ec324 first commit
Nous devons dĂ©jĂ dĂ©terminer lâintervalle de commits que nous voulons inclure dans le colis. Ă la diffĂ©rence des protocoles rĂ©seau qui calculent automatiquement lâensemble minimum des donnĂ©es Ă transfĂ©rer, nous allons devoir les dĂ©finir manuellement. Ici, vous pourriez tout Ă fait lancer la mĂȘme commande et empaqueter le dĂ©pĂŽt complet, ce qui marcherait mais câest mieux de nâempaqueter que la diffĂ©rence â seulement les 3 commits que nous avons localement crĂ©Ă©s.
Pour le faire, vous allez devoir calculer la différence.
Comme décrit dans Plages de commits, vous pouvez faire référence à un intervalle de commits de différentes maniÚres.
Pour dĂ©signer les trois commits que nous avons dans notre branche master et qui nâĂ©tait pas dans la branche que nous avons initialement clonĂ©e, nous pouvons utiliser quelque chose comme origin/master..master
ou master ^origin/master
.
Vous pouvez tester cela avec la sortie de la commande log
.
$ git log --oneline master ^origin/master
71b84da last commit - second repo
c99cf5b fourth commit - second repo
7011d3d third commit - second repo
Comme nous avons maintenant la liste des commits que nous voulons inclure dans le colis, empaquetons-les.
Cela est réalisé avec la commande git bundle create
, suivie dâun nom de fichier et des intervalles des commits que nous souhaitons inclure.
$ git bundle create commits.bundle master ^9a466c5
Comptage des objets : 11, fait.
Delta compression using up to 2 threads.
Compression des objets : 100% (3/3), fait.
Ăcriture de objets : 100% (9/9), 775 bytes, fait.
Total 9 (delta 0), reused 0 (delta 0)
Nous avons à présent un fichier commits.bundle
dans notre répertoire.
Si nous le prenons et lâenvoyons Ă un partenaire, il pourra lâimporter dans le dĂ©pĂŽt dâorigine, mĂȘme si du travail a Ă©tĂ© ajoutĂ© entre temps.
Quand il rĂ©cupĂšre le colis, il peut lâinspecter pour voir ce quâil contient avant de lâimporter dans son dĂ©pĂŽt.
La premiĂšre commande est bundle verify
qui va sâassurer que le fichier est une fichier bundle Git valide et que le dĂ©pĂŽt contient tous les ancĂȘtres nĂ©cessaires pour appliquer correctement le colis.
$ git bundle verify ../commits.bundle
Le colis contient 1 référence :
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master
Le colis exige cette référence
9a466c572fe88b195efd356c3f2bbeccdb504102 second commit
../commits.bundle est correct
Si la personne avait crĂ©Ă© un colis ne contenant que les deux derniers commits quâil avait ajoutĂ©s, plutĂŽt que les trois, le dĂ©pĂŽt initial nâaurait pas pu lâimporter, car il aurait manquĂ© un commit dans lâhistorique Ă reconstituer.
La commande verify
aurait ressemblé plutÎt à ceci :
$ git bundle verify ../commits-bad.bundle
error: Le dépÎt ne dispose pas des commits prérequis suivants :
error: 7011d3d8fc200abe0ad561c011c3852a4b7bbe95 third commit - second repo
Cependant, notre premier colis est valide, et nous pouvons rĂ©cupĂ©rer des commits depuis celui-ci. Si vous souhaitez voir les branches prĂ©sentes dans le colis qui peuvent ĂȘtre importĂ©es, il y a aussi une commande pour donner la liste des sommets des branches :
$ git bundle list-heads ../commits.bundle
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master
La sous-commande verify
vous indiquera aussi les sommets.
Lâobjectif est de voir ce qui peut ĂȘtre tirĂ©, pour que vous puissiez utiliser les commandes fetch
et pull
pour importer des commits depuis le colis.
Ici, nous allons récupérer la branche master
du colis dans une branche appelée other-master
dans notre dépÎt :
$ git fetch ../commits.bundle master:other-master
Depuis ../commits.bundle
* [nouvelle branche] master -> other-master
Maintenant, nous pouvons voir que nous avons importé les commits sur la branche other-master
ainsi que tous les commits que nous avons validés entre-temps dans notre propre branche master
.
$ git log --oneline --decorate --graph --all
* 8255d41 (HEAD, master) third commit - first repo
| * 71b84da (other-master) last commit - second repo
| * c99cf5b fourth commit - second repo
| * 7011d3d third commit - second repo
|/
* 9a466c5 second commit
* b1ec324 first commit
Ainsi, git bundle
peut vraiment ĂȘtre utile pour partager du code ou rĂ©aliser des opĂ©rations nĂ©cessitant du rĂ©seau quand il nây a pas de rĂ©seau ou de dĂ©pĂŽt partagĂ©.