Git : Apprendre une technique pour faire des dépôts distants sans accès réseau

Christophe Pelé

L'open space était inhabituellement calme aujourd'hui. Après quatre heures de code en TDD, il est temps de lever la tête, car c'est vendredi soir et votre TGV part dans 37 minutes.

Vous utilisez Git pour enregistrer votre progression par des commits réguliers. Vous n'avez plus qu'à pousser vos changements sur le dépôt de votre organisation.

$ git push origin master
fatal: unable to access 'https://github.com/votre-login/votre-code.git/': Could not resolve host: github.com

Damned. Le réseau est hors service. Une dernière chose : vous ne le savez pas encore, mais lundi matin le SSD de votre ordinateur aura lâché.

La suite de ce tutoriel va vous apprendre comment vous sortir de ce mauvais pas avec élégance grâce à quelques commandes Git et à la clé USB qui repose au fond de votre besace.

Pour vos suggestions et commentaires, un espace est créé sur le forum.
Commentez

- Titre : Git : Apprendre une technique pour faire des dépôts distants sans accès réseau

- Auteur : Christophe Pelé

- Parution : 7 mai 2017

- Public visé :

- Licence : Copyright ® 2017 Christophe Pelé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. La solution candide

- I-A. En résumé (TL; DR)

- I-B. Trouver le chemin de la clé USB

- I-C. Initialiser le dépôt de sauvegarde

- I-D. Ajouter le dépôt distant

- I-E. Pousser les changements

- I-F. Cloner le dépôt de sauvegarde

- II. Conclusion

- Notes de la rédaction Developpez.com

I - La solution candide

La solution la plus simple est la suivante :

1. Brancher votre clé USB ;

2. Copier votre répertoire projet.

Cette approche est appropriée pour la sauvegarde initiale de votre code. Cependant, lors des sauvegardes ultérieures, elle ne vous permettra pas de tirer parti de Git pour la gestion des changements.

Du reste, votre historique de commits ne sera conservé que si vous pensez à copier le contenu du répertoire .git. Encore une fois, pas de problème pour une sauvegarde initiale, mais ça sera plus difficile la prochaine fois.

La solution « élégante »

La solution suivante vous permettra de conserver votre historique de commits et de bénéficier de la gestion de changements de Git :

1. Brancher votre clé USB ;

2. Initialiser un dépôt Git sur la clé ;

3. Ajouter celui-ci en tant que dépôt distant de votre dépôt de travail ;

4. Pousser vos changements.

I-A - En résumé (TL; DR)

Ouvrez un terminal et exécutez les commandes suivantes :

1. # Trouver le chemin de la clé USB, par exemple :

2. cd /media/votre-login/votre-disque-externe

4. # Initialiser le dépôt de sauvegarde

5. mkdir votre-code.git

6. cd votre-code.git

7. git init --bare

9. # Ajouter le dépôt distant

10. cd /chemin/vers/votre-code

11. git remote add backup /media/votre-login/votre-disque-externe/votre-code.git

13. # Pousser les changements

14. git push backup master

Pour restaurer votre dépôt plus tard :

# Clôner le dépôt de sauvegarde
cd /chemin/vers/autre-repertoire
git clone /media/votre-login/votre-disque-externe/votre-code.git

Tout est là. Pour des explications plus détaillées, continuez la lecture.

I-B - Trouver le chemin de la clé USB

Dès qu'elle est branchée, nous avons besoin de son chemin de montage. Sous macOS c'est dans /Volumes/[VOLUME_NAME] et sous Linux le plus souvent /media/[USER]/[VOLUME_NAME].

Vous trouverez le chemin exact grâce à la commande df -h qui affichera clairement les disques connectés :

1. $ df -h

2. Filesystem      Size  Used Avail Use% Mounted on

3. [...]

4. /dev/sdb7       171G   46G  125G  27% /media/votre-login/votre-disque-externe

I-C - Initialiser le dépôt de sauvegarde

La commande à lancer est git init --bare :

- commande init pour initialiser un dépôt dans le répertoire courant. C'est là que Git va enregistrer votre historique de commits ;

- option --bare pour indiquer que le dépôt ne contiendra pas un répertoire de travail, mais uniquement une base de changements. Ça permet notamment de gagner de l'espace disque. On parle d'un dépôt « nu » ;

- le contenu d'un dépôt nu est le même que celui du répertoire .git d'un dépôt de travail.

1. $ cd /media/votre-login/votre-disque-externe

2. $ mkdir votre-code.git

3. $ cd votre-code.git

5. $ git init --bare

6. Initialized empty Git repository in /media/votre-login/votre-disque-externe/votre-code.git/

8. $ ls

9. branches  config  description  HEAD  hooks  info  objects  refs

I-D - Ajouter le dépôt distant

Maintenant, vous allez associer votre dépôt de sauvegarde avec votre dépôt de travail. La commande git remote add [alias] [target] attribue un alias à un dépôt cible. Ici, l'alias sera « backup » et le dépôt cible est votre dépôt de sauvegarde.

Vous pourrez ensuite afficher des informations détaillées sur vos dépôts distants grâce à la commande git remote (afficher la liste) et l'option -v (informations détaillées).

1. $ cd /chemin/vers/votre-code

2. $ git remote add backup /media/votre-login/votre-disque-externe/votre-code.git

4. $ git remote -v

5. backup /media/votre-login/votre-disque-externe/votre-code.git (fetch)

6. backup /media/votre-login/votre-disque-externe/votre-code.git (push)

7. origin https://github.com/votre-login/votre-code.git (fetch)

8. origin https://github.com/votre-login/votre-code.git (push)

I-E - Pousser les changements

Il ne reste plus qu'à pousser vos changements sur le dépôt de sauvegarde. C'est une commande que vous utilisez quotidiennement : git push [alias] [branch] :

- ici vous devez préciser l'alias de votre dépôt de sauvegarde en argument ;

- le push initial peut être long, car il envoie tout le contenu de votre dépôt de travail ;

- pour le push initial, il faut spécifier une branche (master).

1. $ git push backup master

2. Counting objects: 3, done.

3. Writing objects: 100% (3/3), 208 bytes | 0 bytes/s, done.

4. Total 3 (delta 0), reused 0 (delta 0)

5. To /media/votre-login/votre-disque-externe//votre-code.git

6. * [new branch]      master -> master

I-F - Cloner le dépôt de sauvegarde

Vous êtes de retour de week-end, et votre ordinateur ne démarre pas, panne de disque. Je vous l'avais dit. Vous avez réussi à vous procurer un ordinateur de remplacement et vous brandissez votre fidèle clé USB.

Pour reprendre où vous en étiez, clonez votre dépôt de sauvegarde. C'est la même commande que pour cloner un dépôt Git classique par http. La commande clone accepte un chemin local comme une URL.

$ git clone /media/votre-login/votre-disque-externe/votre-code.git
Cloning into 'votre-code'...
done.

Attention, dans votre nouveau dépôt de travail le clone configure un dépôt distant par défaut origin, qui pointe vers votre dépôt de sauvegarde. Pour retrouver votre configuration de travail initiale, renommez ce dépôt distant et pensez à ajouter le dépôt distant de votre organisation.

1. $ cd votre-code

2. $ git remote -v

3. origin /media/votre-login/votre-disque-externe/votre-code.git/ (fetch)

4. origin /media/votre-login/votre-disque-externe/votre-code.git/ (push)

6. $ git remote rename origin backup

7. $ git remote -v

8. backup /media/votre-login/votre-disque-externe/votre-code.git/ (fetch)

9. backup /media/votre-login/votre-disque-externe/votre-code.git/ (push)

11. $ git remote add origin https://github.com/votre-login/votre-code.git

12. $ git remote -v

13. backup /media/votre-login/votre-disque-externe/votre-code.git/ (fetch)

14. backup /media/votre-login/votre-disque-externe/votre-code.git/ (push)

15. origin https://github.com/votre-login/votre-code.git (fetch)

16. origin https://github.com/votre-login/votre-code.git (push)

II - Conclusion

Vous venez d'utiliser Git pour sauvegarder votre code sur une clé USB. Mais vous avez surtout eu l'occasion de sortir de votre train-train quotidien de pull/commit/push en manipulant les concepts suivants :

- initialisation d'un dépôt nu avec git init --bare ;

- manipuler des dépôts distants avec git remote add, git remote -v, git remote rename ;

- pousser vos changements vers un dépôt spécifique avec git push [alias] [branch].

Voici d'autres usages des dépôts distants :

- stocker un dépôt distant sur votre Google Drive ou Dropbox ;

- ajouter un dépôt distant pointant sur GitHub par https ou ssh ;

- cloner un projet en lecture seule depuis GitHub. Pour pousser des changements, il est possible de faire un fork, ajouter le dépôt distant correspondant et préparer une pull request ;

- ajouter un dépôt distant pointant sur le dépôt local d'un collègue en SSH ;

- créer un dépôt nu sur un répertoire partagé avec vos collègues.

Notes de la rédaction Developpez.com

Nous remercions Xebia pour l'autorisation à publier ce tutoriel. Nos remerciements également à Winjerome pour la mise au gabarit Developpez.com et Claude Leloup pour sa relecture orthographique.