considere:
$ 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
Isso está em macos com um sistema de arquivos que não diferencia maiúsculas de minúsculas . (Não sei se isso é relevante.) No host onde isso ocorre, há uma imagem docker executando o debian com o mesmo diretório montado e, na imagem docker, ocorre o comportamento oposto:
$ 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
Para ser claro, a sequência de comandos executados aqui é: git diff-index
na imagem do docker (retorna 0), git diff-index
no host (retorna 1), git status
no host, git diff-index
no host (retorna 0) , git diff-index
na imagem do docker (retorna 1).
Basicamente, se eu executar git-status
em um ambiente, git diff-index
terá sucesso (retornar 0) naquele ambiente e falhará no outro. Alguma ideia sobre o que está acontecendo? Isso não é um grande problema, e eu suspeito que seja o caso a falta de sensibilidade do sistema de arquivos é a culpada, mas eu adoraria uma explicação sólida.
Resposta
Eu tive uma problema semelhante com e acho que a causa foi a mesma. Isso não precisa envolver Docker ou sistemas de arquivos que não diferenciam maiúsculas de minúsculas, embora possam agravar o problema.
O Git mantém um cache de informações sobre o conteúdo dos arquivos. Normalmente, isso é transparente e de alto nível comandos como git status
e git diff
atualizam o cache conforme necessário.
Comandos de nível inferior como git diff-index
e git diff-files
são projetados para retornar resultados rápidos, mas aproximados. Eles não atualizam o cache. Eles retornam 0 se tiverem certeza de que as coisas que estão comparando são idênticas, mas quando retornam 1, tudo o que significa é “Não estou ciente de que as coisas são idênticas”. Se as entradas de cache estão obsoletas, isso ” É possível que as coisas sejam idênticas, mas git diff-xxx
não sabe.
Não sei exatamente como o cache funciona. Em sua primeira experiência, parece que a primeira chamada para git diff-index
notou que a entrada do cache estava obsoleta e, portanto, retornou 1 para “Não sei”. Em seguida, git status
atualizou o cache, e a segunda chamada para git diff-index
viu entradas de cache válidas e concluiu que os arquivos são idênticos. Em seu segundo experimento, em execução git status
fora do contêiner Docker parece ter criado entradas de cache que git diff-index
dentro do contêiner considerado obsoleto, então a segunda chamada para git diff-index
retornou 1 para “Não sei”.
Minha solução foi esquecer os comandos de baixo nível e seguir git diff --quiet
.