Existem alguns scripts que não funcionam corretamente se eles verificarem alterações.
Eu tentei assim:
VN=$(git describe --abbrev=7 HEAD 2>/dev/null)
git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
then VN="$VN-mod"
fi
Existe algum tipo de verificação booleana se houve alterações desde a última confirmação ou como posso realmente testar se há novas alterações no meu repositório local?
Estou fazendo tudo isso para um script de criação de versão (que encontrei em algum lugar aqui).
git status
?Respostas:
O que você está fazendo quase funcionará: você deve citar
$CHANGED
caso esteja vazio e-z
testar se está vazio, o que significa que não há alterações. O que você quis dizer foi:Uma citação de Git
GIT-VERSION-GEN
:Parece que você estava copiando isso, mas acabou de esquecer os detalhes das citações.
Obviamente, você também pode fazer isso:
Ou se você se importa apenas com o caso "algo mudou":
O uso
--quiet
tem o benefício de que o Git pode parar o processamento assim que encontrar uma única diferença, portanto, talvez não seja necessário verificar toda a sua árvore de trabalho.fonte
git diff --no-ext-diff --quiet --exit-code
para determinar o estado sujo.--no-ext-diff
opção é boa para segurança (caso alguém tenha configurado um driver diff externo), embora isso--exit-code
não seja necessário, pois está implícito--quiet
.git diff-index
relata alterações mesmo que apenas os tempos de modificação do arquivo tenham sido alterados (e não seu conteúdo). Se você étouch
um arquivo, ele relatará uma modificação que a execuçãogit status
será redefinida. Usandogit status
como abaixo é melhor.Usando
git status
:fonte
git status --porcelain --untracked-files=no
]]; entãoif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
veja se a saída não está vazia. Nesse caso, isso significa que há alterações presentes.Embora a resposta de Jefromi seja boa, estou postando isso apenas para referência.
No código-fonte Git, há um
sh
script que inclui o seguinte.fonte
$1
é uma string que nomeia uma tarefa que você deseja executar e$2
é opcionalmente uma string que contém uma mensagem de erro personalizada em caso de falha. Por exemplo, chame-o comorequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
Eu tive um problema semelhante, mas também precisei verificar os arquivos adicionados. Então eu fiz o seguinte:
fonte
git status
é seu amigoMude para o diretório Git para
git status
trabalhar:Defina uma variável para definir a árvore de trabalho para não receber o erro 'Esta operação deve ser executada em uma árvore de trabalho':
Capture a
git status
saída em uma variável BashUse
--porcelain
qual garante estar em um formato padrão e analisável:Se -n (não nulo), temos alterações.
fonte
Isso também funciona:
fonte
Isso funciona bem. Também listará os arquivos afetados:
fonte
git diff --no-ext-diff --quiet --exit-code
também faz o trabalho.Aqui está um bom conjunto de funções de script do Bash que verificam se há um diff, imprimem ao usuário e solicitam ao usuário se eles desejam confirmar alterações antes da implantação. Ele foi criado para um aplicativo Heroku e Python, mas precisa de poucas alterações para qualquer outro aplicativo.
Você pode copiar do Gists em: https://gist.github.com/sshadmand/f33afe7c9071bb725105
fonte
A pergunta do OP tem mais de 9 anos agora. Não sei o que
man git-status
disse então, mas aqui está o que diz agora:Isso sugere que o
--porcelain
argumento é adequado para testar o status de um repositório para alterações.Escreva a pergunta do OP: "Existe algum tipo de verificação booleana se houver alterações desde a última confirmação ou como posso realmente testar se há novas alterações no meu repositório local?"
Eu não acho que
bash
tenha tipos de dados booleanos por si só , mas isso pode ser próximo o suficiente:Isso pode ser relançado como um
if-then-else
formulário para um script ou executado como está na CLI enquanto estiver na pasta git repo . Caso contrário, use a-C
opção com uma especificação de caminho para o repositório de interesse:Termo aditivo:
-u, --untracked-file
opção para evitar o status de relatórios nos arquivos que se deseja ignorar. Observe que isso traz um efeito colateral lamentável : os arquivos adicionados recentemente também não têm status. A opção é útil em algumas situações , mas considere-a cuidadosamente antes de usar.fonte
Aqui está como eu faço isso ...
fonte
cole isso
corre
sh checker_git.sh gitpath
fonte
Baseado em @ storm_m2138 comente a resposta de @ RyanMoon ( link ), estou usando o seguinte em
Powershell
.fonte