Git 🌙
Chapters â–Ÿ 2nd Edition

4.1 Git sur le serveur - Protocoles

À prĂ©sent, vous devriez ĂȘtre capable de rĂ©aliser la plupart des tĂąches quotidiennes impliquant Git. NĂ©anmoins, pour pouvoir collaborer avec d’autres personnes au moyen de Git, vous allez devoir disposer d’un dĂ©pĂŽt distant Git. Bien que vous puissiez techniquement tirer et pousser des modifications depuis et vers des dĂ©pĂŽts personnels, cette pratique est dĂ©conseillĂ©e parce qu’elle introduit trĂšs facilement une confusion avec votre travail actuel. De plus, vous souhaitez que vos collaborateurs puissent accĂ©der Ă  votre dĂ©pĂŽt de sources, y compris si vous n’ĂȘtes pas connecté — disposer d’un dĂ©pĂŽt accessible en permanence peut s’avĂ©rer utile. De ce fait, la mĂ©thode canonique pour collaborer consiste Ă  instancier un dĂ©pĂŽt intermĂ©diaire auquel tout le monde a accĂšs, que ce soit pour pousser ou tirer.

Un serveur Git est simple Ă  lancer. PremiĂšrement, vous devez choisir quels protocoles seront supportĂ©s. La premiĂšre partie de ce chapitre traite des protocoles disponibles et de leurs avantages et inconvĂ©nients. La partie suivante explique certaines configurations typiques de ces protocoles et comment les mettre en Ɠuvre. Enfin, nous traiterons de quelques types d’hĂ©bergement, si vous souhaitez hĂ©berger votre code sur un serveur tiers, sans avoir Ă  installer et maintenir un serveur par vous-mĂȘme.

Si vous ne voyez pas d’intĂ©rĂȘt Ă  gĂ©rer votre propre serveur, vous pouvez sauter directement Ă  la derniĂšre partie de ce chapitre pour dĂ©tailler les options pour mettre en place un compte hĂ©bergĂ©, avant de continuer au chapitre suivant dans lequel les problĂ©matiques de dĂ©veloppement distribuĂ© sont abordĂ©es.

Un dĂ©pĂŽt distant est gĂ©nĂ©ralement un dĂ©pĂŽt nu (bare repository) : un dĂ©pĂŽt Git qui n’a pas de copie de travail. Comme ce dĂ©pĂŽt n’est utilisĂ© que comme centralisateur de collaboration, il n’y a aucune raison d’extraire un instantanĂ© sur le disque ; seules les donnĂ©es Git sont nĂ©cessaires. Pour simplifier, un dĂ©pĂŽt nu est le contenu du rĂ©pertoire .git sans fioriture.

Protocoles

Git peut utiliser quatre protocoles rĂ©seau majeurs pour transporter des donnĂ©es : local, HTTP, Secure Shell (SSH) et Git. Nous allons voir leur nature et dans quelles circonstances ils peuvent (ou ne peuvent pas) ĂȘtre utilisĂ©s.

Protocole local

Le protocole de base est le protocole local pour lequel le dĂ©pĂŽt distant est un autre rĂ©pertoire dans le systĂšme de fichiers. Il est souvent utilisĂ© si tous les membres de l’équipe ont accĂšs Ă  un rĂ©pertoire partagĂ© via NFS par exemple ou dans le cas moins probable oĂč tous les dĂ©veloppeurs travaillent sur le mĂȘme ordinateur. Ce dernier cas n’est pas optimum car tous les dĂ©pĂŽts seraient hĂ©bergĂ©s de fait sur le mĂȘme ordinateur, rendant ainsi toute dĂ©faillance catastrophique.

Si vous disposez d’un systĂšme de fichiers partagĂ©, vous pouvez cloner, pousser et tirer avec un dĂ©pĂŽt local. Pour cloner un dĂ©pĂŽt ou pour l’utiliser comme dĂ©pĂŽt distant d’un projet existant, utilisez le chemin vers le dĂ©pĂŽt comme URL. Par exemple, pour cloner un dĂ©pĂŽt local, vous pouvez lancer ceci :

$ git clone /opt/git/project.git

Ou bien cela :

$ git clone file:///opt/git/project.git

Git opĂšre lĂ©gĂšrement diffĂ©remment si vous spĂ©cifiez explicitement le protocole file:// au dĂ©but de l’URL. Si vous spĂ©cifiez simplement le chemin et si la destination se trouve sur le mĂȘme systĂšme de fichiers, Git tente d’utiliser des liens physiques pour les fichiers communs. Si vous spĂ©cifiez le protocole file://, Git lance un processus d’accĂšs Ă  travers le rĂ©seau, ce qui est gĂ©nĂ©ralement moins efficace. La raison d’utiliser spĂ©cifiquement le prĂ©fixe file:// est la volontĂ© d’obtenir une copie propre du dĂ©pĂŽt, sans aucune rĂ©fĂ©rence ou aucun objet supplĂ©mentaire qui pourraient rĂ©sulter d’un import depuis un autre systĂšme de gestion de version ou d’une action similaire (voir chapitre Les tripes de Git pour les tĂąches de maintenance). Nous utiliserons les chemins normaux par la suite car c’est la mĂ©thode la plus efficace.

Pour ajouter un dépÎt local à un projet Git existant, lancez ceci :

$ git remote add local_proj /opt/git/project.git

Ensuite, vous pouvez pousser vers et tirer depuis ce dĂ©pĂŽt distant de la mĂȘme maniĂšre que vous le feriez pour un dĂ©pĂŽt accessible sur le rĂ©seau.

Avantages

Les avantages des dĂ©pĂŽts accessibles sur le systĂšme de fichiers sont qu’ils sont simples et qu’ils utilisent les permissions du systĂšme de fichiers. Si vous avez dĂ©jĂ  un montage partagĂ© auquel toute votre Ă©quipe a accĂšs, dĂ©ployer un dĂ©pĂŽt est extrĂȘmement facile. Vous placez la copie du dĂ©pĂŽt nu Ă  un endroit accessible de tous et positionnez correctement les droits de lecture/Ă©criture de la mĂȘme maniĂšre que pour tout autre partage. Nous aborderons la mĂ©thode pour exporter une copie de dĂ©pĂŽt nu Ă  cette fin dans la section suivante Installation de Git sur un serveur.

C’est un choix satisfaisant pour partager rapidement le travail. Si vous et votre coĂ©quipier travaillez sur le mĂȘme projet et qu’il souhaite partager son travail, lancer une commande telle que git pull /home/john/project est certainement plus simple que de passer par un serveur intermĂ©diaire.

Inconvénients

Les inconvĂ©nients de cette mĂ©thode sont qu’il est gĂ©nĂ©ralement plus difficile de rendre disponible un partage rĂ©seau depuis de nombreux endroits que de simplement gĂ©rer des accĂšs rĂ©seau. Si vous souhaitez pousser depuis votre portable Ă  la maison, vous devez monter le partage distant, ce qui peut s’avĂ©rer plus difficile et plus lent que d’y accĂ©der directement via un protocole rĂ©seau.

Il faut aussi mentionner que ce n’est pas nĂ©cessairement l’option la plus rapide Ă  l’utilisation si un partage rĂ©seau est utilisĂ©. Un dĂ©pĂŽt local n’est rapide que si l’accĂšs aux fichiers est rapide. Un dĂ©pĂŽt accessible sur un montage NFS est souvent plus lent qu’un dĂ©pĂŽt accessible via SSH sur le mĂȘme serveur qui ferait tourner Git avec un accĂšs aux disques locaux.

Enfin, ce protocole ne protĂšge pas le dĂ©pĂŽt contre un dommage accidentel. Chaque utilisateur Ă  un accĂšs total au rĂ©pertoire « distant » et il n’y a rien pour les empĂȘcher de modifier ou supprimer des fichiers internes Ă  Git et de corrompre le dĂ©pĂŽt.

Protocoles sur HTTP

Git peut communiquer sur HTTP de deux maniĂšres. Avant Git 1.6.6, il n’existait qu’une seule maniĂšre qui Ă©tait trĂšs simple et gĂ©nĂ©ralement en lecture seule. Depuis la version 1.6.6, il existe un nouveau protocole plus intelligent qui nĂ©cessite que Git puisse nĂ©gocier les transferts de donnĂ©es de maniĂšre similaire Ă  ce qu’il fait pour SSH. Ces derniĂšres annĂ©es, le nouveau protocole HTTP a gagnĂ© en popularitĂ© du fait qu’il est plus simple Ă  utiliser et plus efficace dans ses communications. La nouvelle version est souvent appelĂ©e protocole HTTP « intelligent » et l’ancienne version protocole HTTP « idiot ». Nous allons voir tout d’abord le protocole HTTP « intelligent ».

HTTP Intelligent

Le protocole HTTP « intelligent » se comporte de maniĂšre trĂšs similaire aux protocoles SSH ou Git mais fonctionne par-dessus les ports HTTP/S et peut utiliser diffĂ©rents mĂ©canismes d’authentification, ce qui le rend souvent plus facile pour l’utilisateur que SSH, puisque l’on peut utiliser des mĂ©thodes telles que l’authentification par utilisateur/mot de passe plutĂŽt que de devoir gĂ©rer des clĂ©s SSH.

C’est devenu probablement le moyen le plus populaire d’utiliser Git, car il peut ĂȘtre utilisĂ© pour du service anonyme, comme le protocole git:// aussi bien que pour pousser avec authentification et chiffrement, comme le protocole SSH. Au lieu de devoir gĂ©rer diffĂ©rentes URL pour ces usages, vous pouvez maintenant utiliser une URL unique pour les deux. Si vous essayez de pousser et que le dĂ©pĂŽt requiert une authentification (ce qui est normal), le serveur peut demander un nom d’utilisateur et un mot de passe. De mĂȘme pour les accĂšs en lecture.

En fait, pour les services tels que GitHub, l’URL que vous utilisez pour visualiser le dĂ©pĂŽt sur le web (par exemple https://github.com/schacon/simplegit) est la mĂȘme URL utilisable pour le cloner et, si vous en avez les droits, y pousser.

HTTP idiot

Si le serveur ne rĂ©pond pas avec un service Git HTTP intelligent, le client Git essayera de se rabattre sur le protocole HTTP « idiot ». Le protocole idiot consiste Ă  servir le dĂ©pĂŽt Git nu comme des fichiers normaux sur un serveur web. La beautĂ© du protocole idiot rĂ©side dans sa simplicitĂ© de mise en place. Tout ce que vous avez Ă  faire, c’est de copier les fichiers de votre dĂ©pĂŽt nu sous la racine de documents HTTP et de positionner un crochet (hook) post-update spĂ©cifique, et c’est tout (voir Crochets Git). DĂšs ce moment, tous ceux qui peuvent accĂ©der au serveur web sur lequel vous avez dĂ©posĂ© votre dĂ©pĂŽt peuvent le cloner. Pour permettre un accĂšs en lecture seule Ă  votre dĂ©pĂŽt via HTTP, faites quelque chose comme :

$ cd /var/www/htdocs/
$ git clone --bare /chemin/vers/projet_git projetgit.git
$ cd projetgit.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update

Et voilà ! Le crochet post-update livrĂ© par dĂ©faut avec Git lance la commande appropriĂ©e (git update-server-info) pour faire fonctionner correctement le clonage et la rĂ©cupĂ©ration HTTP. Cette commande est lancĂ©e quand vous poussez sur ce dĂ©pĂŽt (peut-ĂȘtre sur SSH). Ensuite, les autres personnes peuvent cloner via quelque chose comme :

$ git clone https://exemple.com/projetgit.git

Dans ce cas particulier, nous utilisons le chemin /var/www/htdocs qui est le plus commun pour une configuration Apache, mais vous pouvez utiliser n’importe quel serveur web statique – placez juste les dĂ©pĂŽts nus dans son chemin. Les donnĂ©es Git sont servies comme de simples fichiers statiques (voir Les tripes de Git pour la maniĂšre exacte dont elles sont servies).

Généralement, vous choisirez soit de lancer un serveur HTTP intelligent avec des droits en lecture/écriture ou de fournir simplement les fichiers en lecture seule par le protocole idiot. Il est rare de mélanger les deux types de protocoles.

Avantages

Nous nous concentrerons sur les avantages de la version intelligente du protocole sur HTTP.

La simplicitĂ© vient de l’utilisation d’une seule URL pour tous les types d’accĂšs et de la demande d’authentification seulement en cas de besoin. Ces deux caractĂ©ristiques rendent les choses trĂšs faciles pour l’utilisateur final. La possibilitĂ© de s’authentifier avec un nom d’utilisateur et un mot de passe apporte un gros avantage par rapport Ă  SSH puisque les utilisateurs n’ont plus Ă  gĂ©nĂ©rer localement les clĂ©s SSH et Ă  tĂ©lĂ©charger leur clĂ© publique sur le serveur avant de pouvoir interagir avec lui. Pour les utilisateurs dĂ©butants ou pour des utilisateurs utilisant des systĂšmes oĂč SSH est moins commun, c’est un avantage d’utilisabilitĂ© majeur. C’est aussi un protocole trĂšs rapide et efficace, similaire Ă  SSH.

Vous pouvez aussi servir vos dĂ©pĂŽts en lecture seule sur HTTPS, ce qui signifie que vous pouvez chiffrer les communications ; ou vous pouvez pousser jusqu’à faire utiliser des certificats SSL Ă  vos clients.

Un autre avantage est que HTTP/S sont des protocoles si souvent utilisĂ©s que les pare-feux d’entreprise sont souvent paramĂ©trĂ©s pour les laisser passer.

Inconvénients

Configurer Git sur HTTP/S peut ĂȘtre un peu plus difficile que sur SSH sur certains serveurs. Mis Ă  part cela, les autres protocoles ont peu d’avantages sur le protocole HTTP intelligent pour servir Git.

Si vous utilisez HTTP pour pousser de maniĂšre authentifiĂ©e, fournir vos information d’authentification est parfois plus compliquĂ© qu’utiliser des clĂ©s sur SSH. Il existe cependant des outils de mise en cache d’informations d’authentification, comme Keychain sur OSX et Credential Manager sur Windows pour rendre cela indolore. Reportez-vous Ă  Stockage des identifiants pour voir comment configurer la mise en cache des mots de passe HTTP sur votre systĂšme.

Protocole SSH

SSH est un protocole rĂ©pandu de transport pour Git en auto-hĂ©bergement. Cela est dĂ» au fait que l’accĂšs SSH est dĂ©jĂ  en place Ă  de nombreux endroits et que si ce n’est pas le cas, cela reste trĂšs facile Ă  faire. Cela est aussi dĂ» au fait que SSH est un protocole authentifié ; et comme il est trĂšs rĂ©pandu, il est gĂ©nĂ©ralement facile Ă  mettre en Ɠuvre et Ă  utiliser.

Pour cloner un dĂ©pĂŽt Git Ă  travers SSH, spĂ©cifiez le prĂ©fixe ssh:// dans l’URL comme ceci :

$ git clone ssh://utilisateur@serveur/projet.git

Vous pouvez utiliser aussi la syntaxe scp habituelle avec le protocole SSH :

$ git clone utilisateur@serveur:projet.git

Vous pouvez aussi ne pas spĂ©cifier de nom d’utilisateur et Git utilisera par dĂ©faut le nom de login.

Avantages

Les avantages liĂ©s Ă  l’utilisation de SSH sont nombreux. PremiĂšrement, SSH est relativement simple Ă  mettre en place, les daemons SSH sont facilement disponibles, les administrateurs rĂ©seau sont habituĂ©s Ă  les gĂ©rer et de nombreuses distributions de systĂšmes d’exploitation en disposent ou proposent des outils pour les gĂ©rer. Ensuite, l’accĂšs distant Ă  travers SSH est sĂ©curisĂ©, toutes les donnĂ©es sont chiffrĂ©es et authentifiĂ©es. Enfin, comme les protocoles HTTP/S, Git et local, SSH est efficace et permet de comprimer autant que possible les donnĂ©es avant de les transfĂ©rer.

Inconvénients

Le point nĂ©gatif avec SSH est qu’il est impossible de proposer un accĂšs anonyme au dĂ©pĂŽt. Les accĂšs sont rĂ©gis par les permissions SSH, mĂȘme pour un accĂšs en lecture seule, ce qui s’oppose Ă  une optique open source. Si vous souhaitez utiliser Git dans un environnement d’entreprise, SSH peut bien ĂȘtre le seul protocole nĂ©cessaire. Si vous souhaitez proposer de l’accĂšs anonyme en lecture seule Ă  vos projets, vous aurez besoin de SSH pour vous permettre de pousser mais un autre protocole sera nĂ©cessaire pour permettre Ă  d’autres de tirer.

Protocole Git

Vient ensuite le protocole Git. Celui-ci est gĂ©rĂ© par un daemon spĂ©cial livrĂ© avec Git. Ce daemon (dĂ©mon, processus en arriĂšre-plan) Ă©coute sur un port dĂ©diĂ© (9418) et propose un service similaire au protocole SSH, mais sans aucune sĂ©curisation. Pour qu’un dĂ©pĂŽt soit publiĂ© via le protocole Git, le fichier git-daemon-export-ok doit exister mais mise Ă  part cette condition sans laquelle le daemon refuse de publier un projet, il n’y a aucune sĂ©curitĂ©. Soit le dĂ©pĂŽt Git est disponible sans restriction en lecture, soit il n’est pas publiĂ©. Cela signifie qu’il ne permet pas de pousser des modifications. Vous pouvez activer la capacitĂ© Ă  pousser mais Ă©tant donnĂ© l’absence d’authentification, n’importe qui sur Internet ayant trouvĂ© l’URL du projet peut pousser sur le dĂ©pĂŽt. Autant dire que ce mode est rarement recherchĂ©.

Avantages

Le protocole Git est souvent le protocole avec la vitesse de transfert la plus rapide. Si vous devez servir un gros trafic pour un projet public ou un trĂšs gros projet qui ne nĂ©cessite pas d’authentification en lecture, il est trĂšs probable que vous devriez installer un daemon Git. Il utilise le mĂȘme mĂ©canisme de transfert de donnĂ©es que SSH, la surcharge du chiffrement et de l’authentification en moins.

Inconvénients

Le dĂ©faut du protocole Git est le manque d’authentification. N’utiliser que le protocole Git pour accĂ©der Ă  un projet n’est gĂ©nĂ©ralement pas suffisant. Il faut le coupler avec un accĂšs SSH ou HTTPS pour quelques dĂ©veloppeurs qui auront le droit de pousser (Ă©crire) et le garder en accĂšs git:// pour la lecture seule. C’est aussi le protocole le plus difficile Ă  mettre en place. Il doit ĂȘtre gĂ©rĂ© par son propre daemon qui est spĂ©cifique. Il nĂ©cessite la configuration d’un daemon xinetd ou apparentĂ©, ce qui est loin d’ĂȘtre simple. Il nĂ©cessite aussi un accĂšs Ă  travers le pare-feu au port 9418 qui n’est pas un port ouvert en standard dans les pare-feux professionnels. DerriĂšre les gros pare-feux professionnels, ce port obscur est tout simplement bloquĂ©.

scroll-to-top