web-dev-qa-db-fra.com

Comment puis-je résoudre les problèmes liés à git / git-Shell?

Comment puis-je avoir des informations de débogage concernant git/git-shell?

J'ai eu un problème, que user1 pourrait cloner un dépôt sans problème, alors que user2 pourrait ne cloner qu'un fichier vide. J'avais mis GIT_TRACE=1, mais rien d’utile n’a été dit.

Enfin, après de longs essais et erreurs, il s’est avéré qu’il s’agissait d’un problème d’autorisation sur un fichier. Un message d'erreur approprié pourrait court-circuiter ce problème.

123
Andor

Pour une sortie encore plus prolixe, utilisez ce qui suit:

GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull Origin master

174
WTK

Débogage

Git a un ensemble assez complet de traces intégrées que vous pouvez utiliser pour déboguer vos problèmes avec Git.

Pour les activer, vous pouvez définir les variables suivantes:

  • GIT_TRACE pour les traces générales,
  • GIT_TRACE_PACK_ACCESS pour le traçage de l'accès aux fichiers pack,
  • GIT_TRACE_PACKET pour le traçage au niveau des paquets pour les opérations réseau,
  • GIT_TRACE_PERFORMANCE pour la consignation des données de performance,
  • GIT_TRACE_SETUP pour plus d’informations sur la découverte du référentiel et de son environnement d’interaction,
  • GIT_MERGE_VERBOSITY pour le débogage de la stratégie de fusion récursive (valeurs: 0-5),
  • GIT_CURL_VERBOSE pour la journalisation de tous les messages curl (équivalent à curl -v),
  • GIT_TRACE_SHALLOW pour le débogage de la récupération/du clonage de référentiels peu profonds.

Les valeurs possibles peuvent inclure:

  • true, 1 ou 2 écrire à stderr,
  • un chemin absolu commençant par / pour suivre la sortie dans le fichier spécifié.

Pour plus de détails, voir: Git Internals - Variables d'environnement


SSH

Pour les problèmes SSH, essayez les commandes suivantes:

echo 'ssh -vvv "$*"' > ssh && chmod +x ssh
GIT_SSH="$PWD/ssh" git pull Origin master

ou utilisez ssh pour valider vos informations d'identification, par exemple.

ssh -vvvT [email protected]

ou sur le port HTTPS:

ssh -vvvT -p 443 [email protected]

Remarque: Réduisez le nombre de -v pour réduire le niveau de verbosité.


Exemples

$ GIT_TRACE=1 git status
20:11:39.565701 git.c:350               trace: built-in: git 'status'

$ GIT_TRACE_PERFORMANCE=$PWD/gc.log git gc
Counting objects: 143760, done.
...
$ head gc.log 
20:12:37.214410 trace.c:420             performance: 0.090286000 s: git command: 'git' 'pack-refs' '--all' '--Prune'
20:12:37.378101 trace.c:420             performance: 0.156971000 s: git command: 'git' 'reflog' 'expire' '--all'
...

$ GIT_TRACE_PACKET=true git pull Origin master
20:16:53.062183 pkt-line.c:80           packet:        fetch< 93eb028c6b2f8b1d694d1173a4ddf32b48e371ce HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed symref=HEAD:refs/heads/master agent=git/2:2.6.5~update-ref-initial-update-1494-g76b680d
...
61
kenorb

essaye celui-là:

GIT_TRACE=1 git pull Origin master
41
C.C.

Si c'est sur SSH, vous pouvez utiliser les éléments suivants:

Pour un niveau de débogage supérieur pour les types -vv ou -vvv pour les niveaux de débogage 2 et 3 respectivement:

# Debug level 1
GIT_SSH_COMMAND="ssh -v" git clone <repositoryurl>

# Debug level 2
GIT_SSH_COMMAND="ssh -vv" git clone <repositoryurl>

# Debug level 3
GIT_SSH_COMMAND="ssh -vvv" git clone <repositoryurl>

Ceci est principalement utile pour gérer les problèmes de clé publique et privée avec le serveur. Vous pouvez utiliser cette commande pour n’importe quelle commande git, pas seulement pour "git clone".

35
Basil Musa

Git 2.9.x/2.10 (T3 2016) ajoute une autre option de débogage: GIT_TRACE_CURL.

Voir commit 73e57aa , commit 74c682d (23 mai 2016) par Elia Pinto (devzero2000) .
Aidé de: Torsten Bögershausen (tboegi) , Ramsay Jones, Junio ​​C Hamano (gitster) , - Eric Sunshine (sunshineco) , et Jeff King (peff) .
(Fusionné par Junio ​​C Hamano - gitster - dans commit 2f84df2 , 6 juil. 2016)

http.c: Implémenter la variable d'environnement GIT_TRACE_CURL

Implémentez la variable d'environnement GIT_TRACE_CURL Pour permettre un plus grand degré de détail de GIT_CURL_VERBOSE, En particulier l'en-tête de transport complet et toutes les données utiles échangées.
Il pourrait être utile si une situation particulière pouvait nécessiter une analyse de débogage plus approfondie.

La documentation indiquera:

GIT_TRACE_CURL

Active un dump de trace complet de toutes les données entrantes et sortantes, y compris les informations descriptives, du protocole de transport git.
Cela ressemble à faire curl --trace-ascii Sur la ligne de commande.

Cette option annule la définition de la variable d'environnement GIT_CURL_VERBOSE.


Vous pouvez voir cette nouvelle option utilisée dans cette réponse , mais également dans les tests Git 2.11 (Q4 2016):

Voir commit 14e2411 , commit 81590bf , commit 4527aa1 , commit 4eee6c6 (07 sept. 2016) par Elia Pinto (devzero2000) .
(Fusion par Junio ​​C Hamano - gitster - dans commit 930b67e , 12 sept. 2016)

Utilisez la nouvelle variable d'environnement GIT_TRACE_CURL À la place de , obsolète GIT_CURL_VERBOSE.

GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git
17
VonC

Avez-vous essayé d'ajouter le verbose (-v) opérateur lorsque vous clonez?

git clone -v git://git.kernel.org/pub/scm/.../linux-2.6 my2.6

4
JamesHalsall

Pour les anciennes versions de Git (1.8 et antérieures)

Je pourrais trouver pas de moyen approprié pour activer le débogage SSH dans une version plus ancienne de git et ssh. J'ai cherché des variables d'environnement en utilisant ltrace -e getenv ... et n’a trouvé aucune combinaison de variables GIT_TRACE ou SSH_DEBUG qui fonctionnerait.

Au lieu de cela, voici une recette pour injecter temporairement 'ssh -v' dans la séquence git-> ssh:

$ echo '/usr/bin/ssh -v ${@}' >/tmp/ssh
$ chmod +x /tmp/ssh
$ PATH=/tmp:${PATH} git clone ...
$ rm -f /tmp/ssh

Voici le résultat de version 1.8. avec la version ssh OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 févr. 201 clonant un dépôt github:

$ (echo '/usr/bin/ssh -v ${@}' >/tmp/ssh; chmod +x /tmp/ssh; PATH=/tmp:${PATH} \
   GIT_TRACE=1 git clone https://github.com/qneill/cliff.git; \
   rm -f /tmp/ssh) 2>&1 | tee log
trace: built-in: git 'clone' 'https://github.com/qneill/cliff.git'
trace: run_command: 'git-remote-https' 'Origin' 'https://github.com/qneill/cliff.git'
Cloning into 'cliff'...
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /home/q.neill/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to github.com ...
...
Transferred: sent 4120, received 724232 bytes, in 0.2 seconds
Bytes per second: sent 21590.6, received 3795287.2
debug1: Exit status 0
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: exec: 'git' 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all'
1
qneill

Git 2.22 (T2 2019) introduit trace2 avec commit ee4512e par Jeff Hostetler :

trace2: Créer une nouvelle fonction de trace combinée

Créez une nouvelle installation de traçage unifiée pour git.
L'intention éventuelle est de remplacer les routines actuelles trace_printf* Et trace_performance* Par un ensemble unifié de routines git_trace2*.

En plus de l'API habituelle de style printf, trace2 Fournit des verbes d'événement de niveau supérieur avec des champs fixes permettant l'écriture de données structurées.
Cela facilite le post-traitement et l'analyse pour les outils externes.

Trace2 définit 3 cibles de sortie.
Ils sont définis à l'aide des variables d'environnement "GIT_TR2", "GIT_TR2_PERF" Et "GIT_TR2_EVENT".
Ceux-ci peuvent être réglés sur "1" ou sur un chemin absolu (tout comme le GIT_TRACE Actuel).

Remarque: en ce qui concerne le nom de la variable d'environnement, utilisez toujours GIT_TRACExxx, Pas GIT_TRxxx.
Donc en réalité GIT_TRACE2, GIT_TRACE2_PERF Ou GIT_TRACE2_EVENT.
Voir le renommage Git 2.22 mentionné plus bas.

Ce qui suit correspond au travail initial sur cette nouvelle fonction de traçage, avec les noms de variable d’environnement old:

  • GIT_TR2 Est destiné à remplacer GIT_TRACE Et à enregistrer les données récapitulatives des commandes.

  • GIT_TR2_PERF Est destiné à remplacer GIT_TRACE_PERFORMANCE.
    Il étend la sortie avec des colonnes pour le processus de commande, le thread, le référentiel, les temps écoulés absolus et relatifs. Il rapporte les événements relatifs aux processus de démarrage/arrêt des processus enfants, de démarrage/d'arrêt des threads et à l'imbrication de fonctions par thread.

  • GIT_TR2_EVENT Est un nouveau format structuré. Il écrit les données d'événement sous forme d'une série d'enregistrements JSON.

Les appels aux fonctions trace2 se connectent à l'une des 3 cibles de sortie activées sans qu'il soit nécessaire d'appeler différentes routines trace_printf* Ou trace_performance*.

Voir commit a4d3a28 (21 mars 2019) par Josh Steadmon (steadmon) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 1b40314 , 08 mai 2019)

trace2: Écrire dans les répertoires cibles

Lorsque la valeur d'une variable d'environnement trace2 est un chemin absolu faisant référence à un répertoire existant, écrivez la sortie dans des fichiers (un par processus) situés sous le répertoire indiqué.
Les fichiers seront nommés en fonction du dernier composant du SID trace2, suivi d'un compteur pour éviter les collisions potentielles.

Cela facilite la collecte de traces pour chaque invocation de git en définissant de manière inconditionnelle la variable env. trace2 Appropriée avec un nom de répertoire constant.


Voir aussi commit f672dee (29 avril 2019), et commit 81567ca , commit 08881b9 , commit bad229a , - commit 26c6f25 , commit bce9db6 , commit 800a7f9 , commit a7bc01e , commit 39f4317 , - commit a089724 , commit 1703751 (15 avril 2019) par Jeff Hostetler (jeffhostetler) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 5b2d1c , 13 mai 2019)

La nouvelle documentation inclut maintenant paramètres de configuration qui ne sont lus que dans les fichiers de configuration système et globaux (ce qui signifie les fichiers de configuration de référentiel local et d'arborescence de travail et les arguments de ligne de commande -c ne sont pas respectés.)

Exemple :

$ git config --global trace2.normalTarget ~/log.normal
$ git version
git version 2.20.1.155.g426c96fcdb

les rendements

$ cat ~/log.normal
12:28:42.620009 common-main.c:38                  version 2.20.1.155.g426c96fcdb
12:28:42.620989 common-main.c:39                  start git version
12:28:42.621101 git.c:432                         cmd_name version (version)
12:28:42.621215 git.c:662                         exit elapsed:0.001227 code:0
12:28:42.621250 trace2/tr2_tgt_normal.c:124 atexit elapsed:0.001265 code:0

Et pour mesure de performance :

$ git config --global trace2.perfTarget ~/log.perf
$ git version
git version 2.20.1.155.g426c96fcdb

les rendements

$ cat ~/log.perf
12:28:42.620675 common-main.c:38                  | d0 | main                     | version      |     |           |           |            | 2.20.1.155.g426c96fcdb
12:28:42.621001 common-main.c:39                  | d0 | main                     | start        |     |  0.001173 |           |            | git version
12:28:42.621111 git.c:432                         | d0 | main                     | cmd_name     |     |           |           |            | version (version)
12:28:42.621225 git.c:662                         | d0 | main                     | exit         |     |  0.001227 |           |            | code:0
12:28:42.621259 trace2/tr2_tgt_perf.c:211         | d0 | main                     | atexit       |     |  0.001265 |           |            | code:0

Comme indiqué dans Git 2.23 (T3 2019), la variable d'environnement à utiliser est GIT_TRACE2.

Voir commit 6114a4 (26 juin 2019) par Carlo Marcelo Arenas Belón (carenas) .
Voir commit 3efa1c6 (12 juin 2019) par var Arnfjörð Bjarmason (avar) .
(Fusionné par Junio ​​C Hamano - gitster - dans commit e9eaaa4 , 9 juillet 2019)

Cela fait suite au travail effectué dans Git 2.22: commit 4e0d3aa , commit e4b75d6 (19 mai 2019) par SZEDER Gábor (szeder) =.
(Fusion par Junio ​​C Hamano - gitster - dans commit 463dca6 , 30 mai 2019)

trace2: Renommer les variables d'environnement en GIT_TRACE2 *

Pour une variable d’environnement supposée être définie par les utilisateurs, les variables GIT_TR2* Env sont trop floues, incohérentes et laides.

La plupart des variables d'environnement établies GIT_* N'utilisent pas les abréviations, et dans le cas de quelques variables (GIT_DIR, GIT_COMMON_DIR, GIT_DIFF_OPTS), C'est assez évidente que les abréviations (DIR et OPTS) représentent.
Mais que veut dire TR? Suivre, traditionnel, remorque, transaction, transfert, transformation, transition, traduction, transplantation, transport, traversée, arbre, déclencheur, tronquer, confiance ou ...?!

Comme le suggère le suffixe "2" dans son nom, trace2 est censé éventuellement remplacer la trace originale de Git.
Il est raisonnable de s’attendre à ce que les variables d’environnement correspondantes fassent de même et, après les variables originales GIT_TRACE, Elles sont appelées GIT_TRACE2; il n'y a rien de tel que 'GIT_TR'.

Toutes les variables de configuration spécifiques à trace2 sont, de manière très judicieuse, dans la section 'trace2', Pas dans 'tr2'.

OTOH, nous ne gagnons rien du tout en omettant les trois derniers caractères de "trace" des noms de ces variables d'environnement .

Nous allons donc renommer toutes les variables d’environnement GIT_TR2* En GIT_TRACE2*, Avant qu’elles ne se retrouvent dans une version stable.

1
VonC