overweeg:

$ 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 

Dit is op macos met een hoofdletterongevoelig bestandssysteem . (Ik weet niet of dat relevant is.) Op de host waar dit gebeurt, is er een docker-image die debian draait met dezelfde directory aangekoppeld, en in de docker-image treedt het tegenovergestelde gedrag op:

$ 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 

Voor alle duidelijkheid: de reeks opdrachten die hier wordt uitgevoerd is: git diff-index op de docker-afbeelding (retourneert 0), git diff-index op de host (retourneert 1), git status op de host, git diff-index op de host (retourneert 0) , git diff-index op de docker-afbeelding (geeft 1 terug).

Kortom, als ik git-status in één omgeving draai, git diff-index zal slagen (retourneren 0) in die omgeving en falen in de andere. Enig idee wat er aan de hand is? Dit is geen probleem, en ik vermoed dat dit het geval is ongevoeligheid van het bestandssysteem is de schuld, maar ik “zou graag een gedegen uitleg krijgen.

Antwoord

Ik heb een soortgelijk probleem met en ik denk dat de oorzaak dezelfde was. Dit hoeft geen Docker- of hoofdlettergevoelige bestandssystemen te betrekken, hoewel deze het probleem kunnen verergeren.

Git houdt een cache bij met informatie over de inhoud van bestanden. Normaal gesproken is dit transparant en van hoog niveau commandos zoals git status en git diff updaten de cache indien nodig.

Lagere commandos zoals git diff-index en git diff-files zijn ontworpen om snelle, maar geschatte resultaten te retourneren. Ze werken de cache niet bij. Ze retourneren 0 als ze “zeker weten dat de dingen die ze vergelijken” identiek zijn, maar als ze 1 retourneren, betekent dit alleen “Ik weet niet dat de dingen identiek zijn”. Als de cache-items verouderd zijn, is het ” Het is mogelijk dat de dingen identiek zijn, maar git diff-xxx weet het niet.

Ik weet niet precies hoe de cache werkt. In uw eerste experiment lijkt het erop dat de eerste aanroep van git diff-index opmerkte dat het cachegeheugen verouderd was en dus 1 retourneerde voor Ik weet het niet. Vervolgens git status werkte de cache bij, en de tweede aanroep van git diff-index zag geldige cachegegevens en kon concluderen dat de bestanden identiek zijn. In je tweede experiment, liep git status buiten de Docker-container lijkt cache-items te hebben gemaakt die git diff-index in de container als verouderd worden beschouwd, dus de tweede aanroep van git diff-index gaf 1 terug voor “Ik weet het niet”.

Mijn oplossing was om low-level commandos te vergeten en vast te houden aan git diff --quiet.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *