L’open space était inhabituellement calme aujourd’hui. Après 4 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 HS. Une dernière chose : vous ne le savez pas encore, mais lundi matin le SSD de votre ordinateur aura lâché.
La suite de cet article explique 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.
La solution candide
La solution la plus simple est la suivante :
- Brancher votre clé USB
- 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.
- Brancher votre clé USB
- Initialiser un dépôt Git sur la clé
- Ajouter celui-ci en tant que dépôt distant de votre dépôt de travail
- Pousser vos changements
En résumé (TL; DR)
Ouvrez un terminal et exécutez les commandes suivantes :
# Trouver le chemin de la clé USB, par exemple : cd /media/votre-login/votre-disque-externe # Initialiser le dépôt de sauvegarde mkdir votre-code.git cd votre-code.git git init --bare # Ajouter le dépôt distant cd /chemin/vers/votre-code git remote add backup /media/votre-login/votre-disque-externe/votre-code.git # Pousser les changements 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.
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 :
$ df -h Filesystem Size Used Avail Use% Mounted on [...] /dev/sdb7 171G 46G 125G 27% /media/votre-login/votre-disque-externe
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épot « 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
$ cd /media/votre-login/votre-disque-externe $ mkdir votre-code.git $ cd votre-code.git $ git init --bare Initialized empty Git repository in /media/votre-login/votre-disque-externe/votre-code.git/ $ ls branches config description HEAD hooks info objects refs
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] [
attribue un alias à un dépôt cible. Ici, l’alias sera « backup » et le dépot cible est votre dépôt de sauvegarde.target
]
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).
$ cd /chemin/vers/votre-code $ git remote add backup /media/votre-login/votre-disque-externe/votre-code.git $ git remote -v backup /media/votre-login/votre-disque-externe/votre-code.git (fetch) backup /media/votre-login/votre-disque-externe/votre-code.git (push) origin https://github.com/votre-login/votre-code.git (fetch) origin https://github.com/votre-login/votre-code.git (push)
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
)
$ git push backup master Counting objects: 3, done. Writing objects: 100% (3/3), 208 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To /media/votre-login/votre-disque-externe//votre-code.git * [new branch] master -> master
Clôner le dépôt de sauvegarde
Vous êtes de retour de weekend, 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, clônez votre dépôt de sauvegarde. C’est la même commande que pour clôner un dépot 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.
$ cd votre-code $ git remote -v origin /media/votre-login/votre-disque-externe/votre-code.git/ (fetch) origin /media/votre-login/votre-disque-externe/votre-code.git/ (push) $ git remote rename origin backup $ git remote -v backup /media/votre-login/votre-disque-externe/votre-code.git/ (fetch) backup /media/votre-login/votre-disque-externe/votre-code.git/ (push) $ git remote add origin https://github.com/votre-login/votre-code.git $ git remote -v backup /media/votre-login/votre-disque-externe/votre-code.git/ (fetch) backup /media/votre-login/votre-disque-externe/votre-code.git/ (push) origin https://github.com/votre-login/votre-code.git (fetch) origin https://github.com/votre-login/votre-code.git (push)
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
oussh
- Clôner 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