Como saber se há alguma alteração na cópia de trabalho no git

0

Eu uso git diff --exit-code para colorir meu prompt de shell para que eu possa ver se há diferenças na cópia de trabalho. Em repositórios muito grandes, isso leva muito tempo, desde que git diff sem o argumento extra.

Eu esperava que --exit-code fizesse o git sair assim que encontrasse a primeira diferença, mas, na verdade, ele imprime o diff. Quando executado com --quiet , é claro que ele não imprime o diff, mas ainda assim leva o mesmo tempo, o que sugere que ele ainda esteja computando todas as alterações, mesmo que não as mostre.

Então, minha pergunta é: existe uma maneira com git diff (ou qualquer outro comando git) para simplesmente verificar se são quaisquer diferenças, e definir um código de saída de acordo, mas sem se preocupar em encontrar e formatar todas as mudanças reais?

Editar: Para contextualizar o tamanho do repositório, são aproximadamente 7.5G (dos quais 4.1G são os .git/ dir) e ~ 160k arquivos rastreados.

    
por dcrosta 06.12.2017 / 20:22

2 respostas

0

Até onde eu sei, não há como fazer isso diretamente com o git.

No entanto, você pode usar o seguinte fragmento de script de shell para verificar muito mais rapidamente:

#!/bin/sh
[ 'git status --porcelain=1 | wc -l' -ne 0 ] && exit 1

O que isto faz é obter saída parseable da máquina do comando git status (que é executado mais rápido que git diff em repositórios grandes porque está apenas verificando a presença de mudanças, não o que elas são), contando o número de linhas (o formato --porcelain=1 retornará exatamente uma linha para cada arquivo modificado, e nenhuma linha se nenhuma for modificada) e, em seguida, sairá com um status de saída diferente de zero se o número for diferente de zero.

Você também pode incorporar isso diretamente em qualquer script que esteja gerando o prompt, retirando a expressão condicional (o bit no [] ) e usando isso em qualquer declaração if está verificando o código de saída para git diff --quiet atualmente.

    
por 06.12.2017 / 20:45
0

Não consigo encontrar imediatamente um comando simples, mas verifiquei o que o módulo de prompt do git em oh-my-zsh faz e é razoavelmente rápido:

Verifique a saída de git status --porcelain --untracked-files=no . Quando um arquivo é modificado, ele terá um M na segunda coluna e, quando houver um conflito de arquivo, ele terá um U na primeira coluna.

Você pode fazer algo assim:

prompt() {
    git status --porcelain --untracked-files=no | grep '^.M' > /dev/null
    CHANGED=$?
    # $CHANGED -eq 0 when there are uncommitted changes

    git status --porcelain --untracked-files=no | grep '^U.' > /dev/null
    CONFLICTS=$?
    # $CONFLICTS -eq 0 when there are merge or rebase conflicts

    git status --porcelain --untracked-files=no | grep '^' > /dev/null
    CLEAN=$((1 - $?))
    # $CLEAN -eq 0 when there are *no* changes, conflicts, or uncommitted staged files
}
    
por 06.12.2017 / 20:53

Tags