considerar:
$ 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 ocorre em macos com um sistema de arquivos que não diferencia maiúsculas de minúsculas. (Não sei se isso é relevante.) No host em que isso ocorre, há uma imagem do docker executando o debian com esse mesmo diretório montado e, na imagem do 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 rodar git-status
em um ambiente, git diff-index
terá sucesso (retorno 0) nesse ambiente e falhará no outro. Alguma opinião sobre o que está acontecendo? Isso não é grande coisa, e suspeito que a insensibilidade entre maiúsculas e minúsculas do sistema de arquivos seja a culpada, mas adoraria uma explicação sólida.
Eu tive um problema semelhante
git diff-files
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 exacerbar o problema.O Git mantém um cache de informações sobre o conteúdo dos arquivos. Normalmente, isso é transparente e comandos de alto nível, como
git status
egit diff
atualizam o cache conforme necessário.Comandos de nível inferior como
git diff-index
egit 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 estiverem obsoletas, é possível que as coisas sejam idênticas, masgit diff-xxx
não saiba.Não sei exatamente como funciona o cache. Em seu primeiro experimento, parece que a primeira chamada
git diff-index
notou que a entrada do cache estava obsoleta e, portanto, retornou 1 para “não sei”. Em seguidagit status
, atualizei o cache, e a segunda chamada paragit diff-index
ver entradas de cache válidas e consegui concluir que os arquivos são idênticos. Em seu segundo experimento, a execuçãogit status
fora do contêiner do Docker parece ter criado entradas de cachegit diff-index
dentro do contêiner consideradas obsoletas, portanto, a segunda chamada paragit diff-index
retornou 1 para "não sei".Minha solução foi esquecer os comandos de baixo nível e manter o
git diff --quiet
.