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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *