-
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.14 Utilitaires Git - Stockage des identifiants
Stockage des identifiants
Si vous utilisez le transport SSH pour vous connecter Ă vos dĂ©pĂŽts distants, il est possible dâavoir une clĂ© sans mot de passe qui permet de transfĂ©rer des donnĂ©es en sĂ©curitĂ© sans devoir entrer un nom dâutilisateur et un mot de passe. Cependant, ce nâest pas possible avec les protocoles HTTP â toute connexion nĂ©cessite un nom dâutilisateur et un mot de passe. Cela devient mĂȘme plus difficile avec des systĂšmes Ă authentification Ă deux facteurs, oĂč le mot de passe utilisĂ© est gĂ©nĂ©rĂ© dynamiquement au hasard et devient imprononçable.
Heureusement, Git dispose dâun systĂšme de gestion dâidentifiants qui peut faciliter cette gestion. Git propose de base quelques options :
-
Par dĂ©faut, rien nâest mis en cache. Toutes les connexions vous demanderont votre nom dâutilisateur et votre mot de passe.
-
Le mode « cache » conserve en mĂ©moire les identifiants pendant un certain temps. Aucun mot de passe nâest stockĂ© sur le disque et les identifiants sont oubliĂ©s aprĂšs 15 minutes.
-
Le mode « store » sauvegarde les identifiants dans un fichier texte simple sur le disque, et celui-ci nâexpire jamais. Ceci signifie que tant que vous ne changerez pas votre mot de passe sur le serveur Git, vous nâaurez plus Ă entrer votre mot de passe. Le dĂ©faut de cette approche est que vos mots de passe sont stockĂ©s en clair dans un fichier texte dans votre rĂ©pertoire personnel.
-
Si vous utilisez un Mac, Git propose un mode « osxkeychain », qui met en cache les identifiants dans un trousseau sécurisé attaché à votre compte systÚme.
-
Si vous utilisez Windows, vous pouvez installer une application appelĂ©e «Â
Git Credential Manager for Windows
 ». Câest similaire Ă lâassistant « osxkeychain » dĂ©crit ci-dessus, mais utilise le Windows Credential Store pour sauvegarder les informations sensibles. winstore peut ĂȘtre tĂ©lĂ©chargĂ© Ă https://github.com/Microsoft/Git-Credential-Manager-for-Windows.
Vous pouvez choisir une de ces méthodes en paramétrant une valeur de configuration Git :
$ git config --global credential.helper cache
Certains de ces assistants ont des options.
Lâassistant « store » accepte un argument --file <chemin>
qui permet de personnaliser lâendroit oĂč le fichier texte est sauvegardĂ© (par dĂ©faut, câest ~/.git-credentials
).
Lâassistant cache
accepte une option --timeout <secondes>
qui modifie la période de maintien en mémoire (par défaut, 900, soit 15 minutes).
Voici un exemple de configuration de lâoption « store » avec un nom de fichier personnalisĂ©Â :
$ git config --global credential.helper 'store --file ~/.my-credentials'
Git vous permet mĂȘme de configurer plusieurs assistants.
Lors de la recherche dâidentifiants pour un serveur donnĂ©, Git les interrogera dans lâordre jusquâĂ la premiĂšre rĂ©ponse.
Pour la sauvegarde des identifiants, Git enverra le nom dâutilisateur et le mot de passe Ă tous les assistants et ceux-ci pourront choisir ce quâils en font.
Voici Ă quoi ressemblerait un .gitconfig
si vous utilisiez un fichier dâidentifiants sur une clĂ© USB mais souhaiteriez utiliser lâoption de cache pour Ă©viter des frappes trop frĂ©quentes si la clĂ© nâest pas insĂ©rĂ©e.
[credential]
helper = store --file /mnt/thumbdrive/.git-credentials
helper = cache --timeout 30000
Sous le capot
Comment tout ceci fonctionne-t-il ?
La commande dâorigine de Git pour le systĂšme dâassistants dâindentification est git credential
, qui accepte une commande comme argument, puis dâautres informations via stdin.
Un exemple peut aider Ă mieux comprendre cela.
Supposons quâun assistant dâidentification a Ă©tĂ© configurĂ© et que lâassistant a stockĂ© les identifiants pour mygithost
.
Voici une session qui utilise la commande « fill » qui est invoquée quand Git essaie de trouver les identifiants pour un hÎte :
$ git credential fill (1)
protocol=https (2)
host=mygithost
(3)
protocol=https (4)
host=mygithost
username=bob
password=s3cre7
$ git credential fill (5)
protocol=https
host=unknownhost
Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7
-
Câest la ligne de commande qui dĂ©marre lâinteraction.
-
Git-credential attend la saisie dâinformations sur stdin. Nous lui fournissons les informations que nous connaissons : le protocole et le nom dâhĂŽte.
-
Une ligne vide indique que lâentrĂ©e est complĂšte et le systĂšme dâidentification devrait rĂ©pondre avec les informations quâil connaĂźt.
-
Git-credential prend alors la main et Ă©crit sur la sortie standard les informations quâil a trouvĂ©es.
-
Si aucune information dâidentification nâa Ă©tĂ© trouvĂ©e, Git demande le nom dâutilisateur et le mot de passe, et les fournit sur la sortie standard dâorigine (ici elles sont rattachĂ©es Ă la mĂȘme console).
Le systĂšme dâaide Ă lâidentification invoque en fait un programme complĂštement sĂ©parĂ© de Git lui-mĂȘme.
Lequel est invoqué et comment il est invoqué dépend de la valeur de configuration credential.helper
.
Cette valeur peut prendre plusieurs formes :
Valeur de configuration | Comportement |
---|---|
|
lance |
|
lance |
|
lance |
|
Le code aprĂšs |
Donc les assistants décrits ci-dessus sont en fait appelés git-credential-cache
, git-credential-store
, et ainsi de suite et nous pouvons les configurer pour accepter des arguments en ligne de commande.
La forme générale pour ceci est git-credential-foo [args] <action>
.
Le protocole stdin/stdout est le mĂȘme que pour git-credential, mais en utilisant un ensemble dâactions lĂ©gĂšrement diffĂ©rent :
-
get
est une requĂȘte pour une paire nom dâutilisateur/mot de passe. -
store
est une requĂȘte pour sauvegarder des identifiants dans la mĂ©moire de lâassistant. -
erase
purge de la mĂ©moire de lâassistant les identifiants rĂ©pondants aux critĂšres.
Pour les actions store
et erase
, aucune rĂ©ponse nâest exigĂ©e (Git les ignore de toute façon).
Pour lâaction get
cependant, Git est trĂšs intĂ©ressĂ© par ce que lâassistant peut en dire.
Si lâassistant nâa rien Ă en dire dâutile, il peut simplement sortir sans rien produire, mais sâil sait quelque chose, il devrait augmenter lâinformation fournie avec celle quâil a stockĂ©e.
La sortie est traitĂ©e comme une sĂ©rie de dĂ©clarations dâaffectation ; tout ce qui est fourni remplacera ce que Git connaĂźt dĂ©jĂ .
Voici le mĂȘme exemple que ci-dessus, mais en sautant git-credential et en sâattaquant directement Ă git-credential-store :
$ git credential-store --file ~/git.store store (1)
protocol=https
host=mygithost
username=bob
password=s3cre7
$ git credential-store --file ~/git.store get (2)
protocol=https
host=mygithost
username=bob (3)
password=s3cre7
-
Ici nous indiquons Ă
git-credential-store
de sauvegarder des identifiants : le nom dâutilisateur (username) « bob » et le mot de passe (password) « s3cre7 » doivent ĂȘtre utilisĂ©s quandhttps://mygithost
est accédé. -
Maintenant, nous allons rĂ©cupĂ©rer ces identifiants. Nous fournissons les parties de lâinformation de connexion que nous connaissons (
https://mygithost
), suivi dâune ligne vide. -
git-credential-store
rĂ©pond avec le nom dâutilisateur et le mot de passe que nous avons prĂ©cĂ©demment stockĂ©s.
Voici Ă quoi ressemble le fichier ~/git.store
 :
https://bob:s3cre7@mygithost
Câest juste une sĂ©rie de lignes, chacune contenant des URLs contenant les informations dâidentification.
Les assistants osxkeychain
et winstore
utilisent le format natif de leurs banques de stockage, tandis que cache
utilise son propre format en mĂ©moire (quâaucun autre processus ne peut lire).
Un cache dâidentifiants personnalisĂ©
Ătant donnĂ© que git-credential-store
et consort sont des programmes sĂ©parĂ©s de Git, il y a peu Ă penser que nâimporte quel programme peut ĂȘtre un assistant dâidentification Git.
Les assistants fournis par Git gĂšrent de nombreux cas dâutilisation habituels, mais pas tous.
Par exemple, supposons que votre équipe dispose de certains identifiants qui sont partagés par tous, pour le déploiement.
Ils sont stockĂ©s dans un rĂ©pertoire partagĂ©, mais vous ne les copiez pas dans votre propre magasin dâidentifiants parce quâils changent souvent.
Aucun assistant existant ne gĂšre ce cas ; voyons ce quâil faudrait pour Ă©crire le nĂŽtre.
Ce programme doit présenter certaines fonctionnalités clé :
-
La seule action à laquelle nous devons répondre est
get
 ;store
eterase
sont des opĂ©rations dâĂ©criture, donc nous sortirons directement et proprement dans ces cas. -
Le format du fichier dâidentifiants partagĂ©s est identique Ă celui utilisĂ© par
git-credential-store
. -
Lâemplacement de ce fichier est assez standard, mais nous devrions pouvoir laisser lâutilisateur spĂ©cifier une chemin en cas de besoin.
Une fois de plus, nous Ă©crirons cette extension en Ruby, mais nâimporte quel langage fonctionnera, tant que Git peut lancer un exĂ©cutable Ă la fin. Voici le code source complet de ce nouvel assistant dâidentification :
#!/usr/bin/env ruby
require 'optparse'
path = File.expand_path '~/.git-credentials' # (1)
OptionParser.new do |opts|
opts.banner = 'USAGE: git-credential-read-only [options] <action>'
opts.on('-f', '--file PATH', 'Specify path for backing store') do |argpath|
path = File.expand_path argpath
end
end.parse!
exit(0) unless ARGV[0].downcase == 'get' # (2)
exit(0) unless File.exists? path
known = {} # (3)
while line = STDIN.gets
break if line.strip == ''
k,v = line.strip.split '=', 2
known[k] = v
end
File.readlines(path).each do |fileline| # (4)
prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).first
if prot == known['protocol'] and host == known['host'] then
puts "protocol=#{prot}"
puts "host=#{host}"
puts "username=#{user}"
puts "password=#{pass}"
exit(0)
end
end
-
Ici, nous analysons les options de la ligne de commande, pour permettre Ă lâutilisateur de spĂ©cifier un fichier. Par dĂ©faut, câest
~/.git-credentials
. -
Ce programme ne rĂ©pondra que si lâaction est
get
et si le fichier magasin existe. -
Cette boucle lit depuis stdin jusquâĂ la premiĂšre ligne vide. Les entrĂ©es sont stockĂ©es dans le hash
known
pour référence ultérieure. -
Cette boucle lit le contenu du fichier magasin, et recherche les correspondances. Si le protocole et lâhĂŽte depuis
known
correspondent à la ligne, le programme imprime les résultats sur stdout et sort.
Nous allons sauvegarder notre assistant comme git-credential-read-only
, le placer quelque part dans notre PATH
et le marquer exécutable.
Voici à quoi ressemble une session interactive :
$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost
protocol=https
host=mygithost
username=bob
password=s3cre7
Puisque son nom commence par git-
, nous pouvons utiliser une syntaxe simple pour la valeur de configuration :
$ git config --global credential.helper read-only --file /mnt/shared/creds
Comme vous pouvez le voir, étendre ce systÚme est plutÎt direct et peut résoudre des problÚmes communs pour vous et votre équipe.