considérer:

$ git --version git version 2.20.1 (Apple Git-117) $ git diff-index --quiet HEAD ; echo $? 1 $ git status > /dev/null $ git diff-index --quiet HEAD ; echo $? 0 

Ceci est sur macOS avec un système de fichiers insensible à la casse . (Je ne sais pas si cela est pertinent.) Sur lhôte où cela se produit, il y a une image docker exécutant debian avec ce même répertoire monté, et dans limage docker, le comportement inverse se produit:

$ git diff-index --quiet HEAD ; echo $? 0 # At this point, `git status` was invoked outside the docker image $ git --version git version 2.20.1 $ git diff-index --quiet HEAD ; echo $? 1 

Pour être clair, la séquence de commandes exécutées ici est: git diff-index sur limage du docker (renvoie 0), git diff-index sur lhôte (renvoie 1), git status sur lhôte, git diff-index sur lhôte (renvoie 0) , git diff-index sur limage du docker (renvoie 1).

En gros, si jexécute git-status dans un environnement, git diff-index réussira (renvoie 0) dans cet environnement et échouera dans lautre. Avez-vous une idée de ce qui se passe? Ce nest pas un gros problème, et je pense que cest le cas linsensibilité du système de fichiers est à blâmer, mais jaimerais une explication solide.

Réponse

Jai eu une problème similaire avec et je pense que la cause était la même. Cela na pas besoin dimpliquer Docker ou des systèmes de fichiers insensibles à la casse, bien que cela puisse aggraver le problème.

Git maintient un cache dinformations sur le contenu des fichiers. Normalement, cest transparent et de haut niveau des commandes telles que git status et git diff mettent à jour le cache si nécessaire.

Commandes de niveau inférieur telles que git diff-index et git diff-files sont conçus pour renvoyer des résultats rapides, mais approximatifs. Ils ne mettent pas à jour le cache. Ils renvoient 0 sils « sont sûrs que les choses quils » comparent sont identiques, mais quand ils renvoient 1, tout ce que cela signifie est « Je » ne sais pas que les choses sont identiques « . Si les entrées du cache sont périmées, cest » Il est possible que les choses soient identiques mais git diff-xxx ne sait pas.

Je ne sais pas exactement comment le cache fonctionne. Lors de votre première expérience, il semble que le premier appel à git diff-index ait remarqué que lentrée de cache était obsolète, et a donc renvoyé 1 pour « Je ne sais pas ». Ensuite, git status a mis à jour le cache et le deuxième appel à git diff-index a détecté des entrées de cache valides et a pu conclure que les fichiers sont identiques. Lors de votre deuxième test, exécution git status en dehors du conteneur Docker semble avoir créé des entrées de cache qui git diff-index à lintérieur du conteneur considéré comme périmé, donc le deuxième appel à git diff-index a renvoyé 1 pour « Je ne sais pas ».

Ma solution était doublier les commandes de bas niveau et de men tenir à git diff --quiet.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *