-
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Ć©.