Git 🌙
Chapters â–Ÿ 2nd Edition

10.8 Les tripes de Git - Les variables d’environnement

Les variables d’environnement

Git s’exĂ©cute toujours dans un shell bash, et utilise un certain nombre de variables d’environnement pour savoir comment se comporter. Il est parfois pratique de savoir lesquelles, et la façon de les utiliser pour que Git se comporte comme vous le souhaitez. Ceci n’est pas une liste exhaustive de toutes les variables d’environnement que Git utilise, mais nous allons voir les plus utiles.

Comportement général

Certains aspects du comportement gĂ©nĂ©ral de Git en tant que programme dĂ©pend de variables d’environnement.

GIT_EXEC_PATH dĂ©termine l’endroit oĂč Git va chercher ses sous-programmes (comme git-commit, git-diff, et d’autres). Vous pouvez vĂ©rifier le rĂ©glage actuel en lançant git --exec-path.

HOME n’est pas en gĂ©nĂ©ral considĂ©rĂ©e comme modifiable (trop d’autres choses en dĂ©pendent), mais c’est l’endroit oĂč Git va chercher le fichier de configuration gĂ©nĂ©ral (global). Si vous voulez une installation de Git vraiment portable, complĂšte du point de vue de la configuration gĂ©nĂ©rale, vous pouvez surcharger HOME dans le profil (profile).

PREFIX est l’équivalent pour la configuration au niveau du systĂšme. Git va chercher le fichier $PREFIX/etc/gitconfig.

GIT_CONFIG_NOSYSTEM, si elle est dĂ©finie, invalide l’utilisation du fichier de configuration au niveau du systĂšme. Cette variable est utile si la configuration systĂšme interfĂšre avec vos commandes et que vous n’avez pas les privilĂšges pour la changer ou la supprimer.

GIT_PAGER contrĂŽle le programme que vous utilisez pour afficher les rĂ©sultats sur plusieurs pages Ă  la ligne de commande. Si elle n’est pas dĂ©finie, Git utilisera PAGER Ă  la place.

GIT_EDITOR est l’éditeur lancĂ© par Git quand l’utilisateur doit taper du texte (un message de commit par exemple). Si elle n’est pas dĂ©finie, Git utilisera EDITOR.

Les emplacements du dépÎt

Git utilise plusieurs variables d’environnement pour dĂ©terminer comment interagir avec le dĂ©pĂŽt courant.

GIT_DIR est l’emplacement du rĂ©pertoire .git. S’il n’est pas spĂ©cifiĂ©, Git remonte l’arbre des rĂ©pertoires jusqu’à ce qu’il arrive Ă  ~ ou bien /, en cherchant un rĂ©pertoire .git Ă  chaque Ă©tape.

GIT_CEILING_DIRECTORIES contrĂŽle le comportement de Git pendant la recherche d’un rĂ©pertoire .git. Si vous ĂȘtes sur des rĂ©pertoires qui se chargent lentement (par exemple sur une bande magnĂ©tique ou Ă  travers une connexion rĂ©seau lente), vous pouvez souhaiter que Git s’arrĂȘte plus tĂŽt qu’il ne le ferait habituellemnt, surtout si Git est appelĂ© Ă  la construction de votre appel shell (prompt).

GIT_WORK_TREE est l’emplacement de la racine du rĂ©pertoire de travail pour un dĂ©pĂŽt non nu. Si cette variable n’est pas spĂ©cifiĂ©e, c’est le rĂ©pertoire parent de $GIT_DIR qui est utilisĂ©.

GIT_INDEX_FILE est le chemin du fichier d’index (uniquement pour les dĂ©pĂŽts non nus).

GIT_OBJECT_DIRECTORY peut ĂȘtre utilisĂ© pour spĂ©cifier l’emplacement du rĂ©pertoire qui se trouve habituellement Ă  .git/objects.

GIT_ALTERNATE_OBJECT_DIRECTORIES est une liste sĂ©parĂ©e par des « : » (formattĂ©e comme ceci : /rep/un:/rep/deux:
) qui dit Ă  Git oĂč trouver les objets s’ils ne sont pas dans GIT_OBJECT_DIRECTORY. S’il vous arrive d’avoir beaucoup de projets avec des gros fichiers ayant exactement le mĂȘme contenu, cette variable peut vous Ă©viter d’en garder trop de copies.

Pathspecs

Une "pathspec" fait rĂ©fĂ©rence Ă  la façon dont on spĂ©cifie les chemins dans Git, y compris l’utilisation des jokers. Ils sont utilisĂ©s dans le fichier .gitignore, mais Ă©galement Ă  la ligne de commande (git add \*.c).

GIT_GLOB_PATHSPECS et GIT_NOGLOB_PATHSPECS contrĂŽlent le comportement par dĂ©faut des jokers dans les pathspecs. Si GIT_GLOB_PATHSPECS vaut 1, les caractĂšres jokers agissent comme des jokers (ce qui est le comportement par dĂ©faut) ; si GIT_NOGLOB_PATHSPECS vaut 1, les caractĂšres jokers ne correspondent qu’à eux-mĂȘme, ce qui veut dire que quelque chose comme *.c ne correspondrait qu’à un fichier nommĂ© « \*.c », et non pas tout fichier dont le nom se termine par .c. Vous pouvez surcharger ce comportement pour certains cas en faisant commencer la pathspec par :(glob) pour utiliser le joker, ou bien :(literal) pour une correspondance stricte, comme dans :(glob)\*.c.

GIT_LITERAL_PATHSPECS empĂȘche ces deux comportements ; aucun joker ne fonctionnera, et les prĂ©fixes de surcharge seront Ă©galement inopĂ©rants.

GIT_ICASE_PATHSPECS rend toutes les pathspecs insensibles Ă  la casse.

Création de commits

La crĂ©ation finale d’un objet Git commit est habituellement faite par git-commit-tree, qui utilise les variables d’environnement suivantes comme premiĂšre source d’information, se repliant sur les valeurs de configuration seulement si celles-ci ne sont pas prĂ©sentes :

GIT_AUTHOR_NAME est le nom lisible par un humain dans le champ « Auteur » (author).

GIT_AUTHOR_EMAIL est l’adresse de courriel pour le champ « Auteur ».

GIT_AUTHOR_DATE est l’horodatage utilisĂ© pourle champ « Auteur ».

GIT_COMMITTER_NAME définit le nom humain pour le champ « Validateur » (commiter).

GIT_COMMITTER_EMAIL est l’adresse de courriel pour le champ « Validateur ».

GIT_COMMITTER_DATE est utilisĂ© pour l’horodatage dans le champ « Validateur ».

EMAIL est l’adresse de courriel de repli pour le cas oĂč la valeur de configuration user.email n’est pas dĂ©finie. Si celle-ci n’est pas dĂ©finie, Git se replie sur les noms d’utilisateur systĂšme et d’hĂŽte.

Travail sur le réseau

Git utilise la bibliothĂšque curl pour effectuer des opĂ©rations sur HTTP, ainsi GIT_CURL_VERBOSE demande Ă  Git d’émettre tous les messages gĂ©nĂ©rĂ©s par cette bibliothĂšque. C’est similaire Ă  curl -v en ligne de commande.

GIT_SSL_NO_VERIFY demande Ă  Git de ne pas vĂ©rifier les certificats SSL. Cela peut ĂȘtre parfois nĂ©cessaire si vous utilisez des certificats auto-signĂ©s pour servir des dĂ©pĂŽts Git sur HTTPS, ou si vous ĂȘtes au milieu de l’installation d’un serveur Git mais n’avez pas encore installĂ© un certificat complet.

Si le taux de donnĂ©es d’une opĂ©ration HTTP est plus basse que GIT_HTTP_LOW_SPEED_LIMIT octets par seconde pendant plus longtemps que GIT_HTTP_LOW_SPEED_TIME secondes, Git annulera cette opĂ©ration. Ces valeurs surchargent les valeurs de configuration http.lowSpeedLimit et http.lowSpeedTime.

GIT_HTTP_USER_AGENT dĂ©finit la chaĂźne d’agent utilisateur utilisĂ©e par Git quand il communique sur HTTP. La valeur par dĂ©faut est quelque chose comme git/2.0.0.

Visualisation des différences et Fusion

GIT_DIFF_OPTS est un terme un peu inapproprié. Les seules valeurs valides sont -u<n> ou --unified=<n>, qui contrÎlent le nombre de lignes de contexte affichées dans une commande git diff.

GIT_EXTERNAL_DIFF est utilisée comme une surcharge de la valeur de configuration diff.external. Si elle est définie, Git invoquera ce programme quand git diff sera invoquée.

GIT_DIFF_PATH_COUNTER et GIT_DIFF_PATH_TOTAL sont utiles Ă  l’intĂ©rieur du programme spĂ©cifiĂ© par GIT_EXTERNAL_DIFF ou diff.external. Le premier represente le fichier de la sĂ©rie dont on est en train de visualiser les diffĂ©rences (en commençant par 1), et le dernier est le nombre total de fichiers dans le lot.

GIT_MERGE_VERBOSITY contrÎle la sortie pour la stratégie de fusion récursive. Les valeurs admises sont les suivantes :

  • 0 ne sort rien, sauf Ă©ventuellement un seul message d’erreur.

  • 1 ne montre que les conflits.

  • 2 montre aussi les modifications de fichier.

  • 3 montre quand les fichiers sont sautĂ©s parce qu’ils n’ont pas changĂ©.

  • 4 montre tous les chemins qui sont en train d’ĂȘtre traitĂ©s.

  • 5 et au-delĂ  montrent des informations dĂ©taillĂ©es de dĂ©bogage.

La valeur par défaut est 2.

DĂ©bogage

Vous voulez vraiment savoir de quoi Git est capable ? Git comprend un ensemble de traces assez complet, et tout ce que vous avez à faire est de les activer. Les valeurs possibles de ces variables sont les suivantes :

  • « true », « 1 » ou « 2 » – la catĂ©gorie de trace est Ă©crite sur la sortie d’erreur standard (stderr).

  • Un chemin absolu commençant par / – la sortie de trace sera Ă©crite dans ce fichier.

GIT_TRACE contrÎle les traces générales, qui ne rentrent dans aucune catégorie spécifique. Cela inclut le développement des alias et la délégation aux autres sous-programmes.

$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554               trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341       trace: run_command: 'git-lga'
20:12:49.879529 git.c:282               trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349               trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341       trace: run_command: 'less'
20:12:49.899675 run-command.c:192       trace: exec: 'less'

GIT_TRACE_PACK_ACCESS contrĂŽle le traçage d’accĂšs aux fichiers groupĂ©s. Le premier champ est le fichier groupĂ© auquel on est en train d’accĂ©der, le second est le dĂ©calage dans ce fichier :

$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 35175
# [
]
20:10:12.087398 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

GIT_TRACE_PACKET permet le traçage au niveau paquet pour les opérations sur le réseau.

$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46           packet:          git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46           packet:          git< 0000
20:15:14.867079 pkt-line.c:46           packet:          git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46           packet:          git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46           packet:          git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# [
]

GIT_TRACE_PERFORMANCE contrîle la journalisation d’information de performance. La sortie montre combien de temps prend chaque invocation particulùre de Git.

$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414             performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414             performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414             performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414             performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414             performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414             performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414             performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414             performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414             performance: 6.112217000 s: git command: 'git' 'gc'

GIT_TRACE_SETUP montre des informations sur ce que Git dĂ©couvre sur le dĂ©pĂŽt et l’environnement avec lequel il interagit.

$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315             setup: git_dir: .git
20:19:47.087184 trace.c:316             setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317             setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318             setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Divers

GIT_SSH, si spĂ©cifiĂ©, est un programme qui est invoquĂ© Ă  la place de ssh quand Git essaie de se connecter Ă  un hĂŽte SSH. Il est invoquĂ© comme $GIT_SSH [username@]host [-p <port>] <command>. Notez que ce n’est pas le moyen le plus facile de personnaliser la façon dont ssh est invoqué ; il ne prendra pas en compte des paramĂštres supplĂ©mentaires en ligne de commande, donc vous devriez Ă©crire un script l’enveloppant et faire pointer GIT_SSH dessus. Il est sans doute plus facile d’utiliser le fichier ~/.ssh/config pour cela.

GIT_ASKPASS est une surcharge pour la valeur de configuration core.askpass. C’est le programme invoquĂ© lorsque Git Ă  besoin de demander ses identifiants Ă  l’utilisateur, qui peut s’attendre Ă  un texte comme argument en ligne de commande, et qui devrait retourner la rĂ©ponse sur la sortie standard (stdout). (Consultez Stockage des identifiants pour plus d’information sur ce sous-systĂšme.)

GIT_NAMESPACE contrĂŽle l’accĂšs des rĂ©fĂ©rences cloisonnĂ©es dans des espaces de nom, et est Ă©quivalent Ă  l’option --namespace. C’est surtout utile cĂŽtĂ© serveur, oĂč vous pourriez vouloir stocker plusieurs bifurcations (forks) d’un seul dĂ©pĂŽt dans un seul dĂ©pĂŽt, en gardant seulement les rĂ©fĂ©rences sĂ©parĂ©es.

GIT_FLUSH peut ĂȘtre utilisĂ©e pour forcer Git Ă  utiliser des entrĂ©es/sorties non mises en mĂ©moire tampon (buffer) quand il Ă©crit progressivement dans la sortie standard. Une valeur de 1 fait que Git Ă©vacue (flush) plus souvent, une valeur de 0 fait que la sortie est mise en mĂ©moire tampon. La valeur par dĂ©faut (si la variable n’est pas dĂ©finie) est Ă  choisir selon un plan appropriĂ© de mise en mĂ©moire tampon en fonction de l’activitĂ© et du mode de sortie.

GIT_REFLOG_ACTION vous permet de spécifier le texte descriptif écrit dans le reflog. Voici un exemple :

$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'my message'
[master 9e3d55a] my message
$ git reflog -1
9e3d55a HEAD@{0}: my action: my message
scroll-to-top