-
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
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é.