O objetivo é obter um status inequívoco que possa ser avaliado em um comando shell.
Eu tentei, git status
mas sempre retorna 0, mesmo se houver itens a serem confirmados.
git status
echo $? #this is always 0
Eu tenho uma ideia, mas acho que é uma péssima idéia.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
qualquer outra maneira?
atualizar com a seguinte solução, consulte a publicação de Mark Longair
Eu tentei isso, mas isso causa um problema.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Estou tendo o erro a seguir [: ??: binary operator expected
agora, estou olhando para o homem e tente o diff do git.
=================== código para minha esperança, e espero uma resposta melhor ======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
git
git-status
9nix00
fonte
fonte
$(git status --porcelain)
. Além disso, se você quiser colocar pontos de exclamação em sua mensagem, você vai precisar usar aspas simples em vez de aspas duplas - ou seja, ele deve serecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
em vez$(git status --porcelain)
, como eu disse!Respostas:
Uma alternativa para testar se a saída de
git status --porcelain
está vazia é testar cada condição com a qual você se preocupa separadamente. Nem sempre se pode importar, por exemplo, se houver arquivos não rastreados na saída degit status
.Por exemplo, para verificar se há alguma mudança local não faseada, é possível consultar o código de retorno de:
Para verificar se há alguma mudança preparada, mas não confirmada, você pode usar o código de retorno de:
Por fim, se você quiser saber se existem arquivos não rastreados em sua árvore de trabalho que não são ignorados, você pode testar se a saída do seguinte comando está vazia:
Atualização: Você pergunta abaixo se pode alterar esse comando para excluir os diretórios na saída. Você pode excluir diretórios vazios adicionando
--no-empty-directory
, mas para excluir todos os diretórios dessa saída, acho que você terá que filtrar a saída, como por exemplo:O
-v
toegrep
significa apenas linhas de saída que não correspondem ao padrão, e o padrão corresponde a qualquer linha que termine com a/
.fonte
--quiet
(o que implica--exit-code
) também silencia a saída, para quem deseja apenas o código de saída.O valor de retorno
git status
apenas informa o código de saída degit status
, não se houver alguma modificação a ser confirmada.Se você deseja uma versão mais legível por computador da
git status
saída, tenteVeja a descrição de
git status
para mais informações sobre isso.Exemplo de uso (o script simplesmente testa se
git status --porcelain
há saída, sem necessidade de análise):Observe que você deve citar a string para testar, ou seja, a saída de
git status --porcelain
. Para obter mais dicas sobre construções de teste, consulte o Advanced Bash Scripting Guide ( comparação de cadeias de seção ).fonte
|| echo no
à substituição de comando para que o espaço de trabalho não seja reportado por engano como limpo segit status
falhar fundamentalmente. Além disso, seu código é (louvável) compatível com POSIX, mas como você vincula um guia do bash, deixe-me acrescentar que se você usar o bash em[[ ... ]]
vez do compatível com o POSIX[ ... ]
, não será necessário citar duas vezes a substituição do comando (embora não faz mal):[[ -z $(git status --porcelain) ]]
.Se você é como eu, quer saber se existem:
1) alterações nos arquivos existentes 2) arquivos adicionados recentemente 3) arquivos excluídos
e, especificamente, não deseja saber sobre 4) arquivos não rastreados.
Isso deve servir:
Aqui está o meu código bash para sair do script se o repositório estiver limpo. Ele usa a versão curta da opção de arquivos não rastreados:
fonte
—untracked-files=no
; Eu acho que seu teste pode ser simplificado[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
não deve escrever para stderr, a menos que algo fundamental der errado - e então você não quer ver essa saída. (Se você queria um comportamento mais robusto nesse evento, acrescente|| echo no
a substituição de comando para que o teste de limpeza ainda falhe). Comparações de strings / o-z
operador pode lidar com strings de várias linhas - sem necessidadetail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
É possível combinar
git status --porcelain
com um simplesgrep
para executar o teste.Às vezes, uso isso como uma linha simples:
Adicione
-qs
ao seu comando grep para silenciá-lo.fonte
git status
falhar fatalmente (por exemplo, um repositório corrompido), seu teste relatará por engano um espaço de trabalho limpo . Uma opção é usargit status --porcelain 2>&1
, mas isso 'consumiria' a mensagem de erro se você usasse grep-q
. (Lidar com isso perderia a elegância:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
No código-fonte git, existe um script sh que inclui o seguinte.
Este sniplet mostra como é possível usar
git diff-files
egit diff-index
descobrir se há alguma alteração nos arquivos conhecidos anteriormente. No entanto, não permite descobrir se um novo arquivo desconhecido foi adicionado à árvore de trabalho.fonte
if [ -n "$(git ls-files --others --exclude-standard)" ]
sem nenhuma tubulação ou greping adicional deve ser suficiente para detectar arquivos não rastreados.eu faria um teste sobre isso:
ou isso seja explícito:
Onde:
--exit-code
Faça o programa sair com códigos semelhantes ao diff (1). Ou seja, sai com 1 se houver diferenças e 0 significa que não há diferenças.
--quieto
Desative toda a saída do programa. Implica --exit-code
fonte
Estou um pouco atrasado na discussão, mas se for necessário apenas um código de saída 0 se
git status --porcelain
não retornar nada e! = 0 mais, tente o seguinte:Isso fará com que o número de linhas seja o código de saída, correndo o risco de ocorrer problemas quando houver mais de 255 linhas. assim
será responsável por isso;)
fonte
Estou usando isso em um script para ter:
1 quando há arquivos diff ou não rastreados
[-z "$ (status git --porcelain)"]
fonte
if ! git diff --quiet; then
é mais limpo e com melhor desempenho (eu acho). Em outras palavras, use o código de saída, não o stdout.git diff --quiet
se comporta de maneira diferente dasgit status --porcelain
alterações em cache.Não é bonito, mas funciona:
Não tenho certeza se a mensagem depende da localidade, então talvez coloque uma
LANG=C
na frente.fonte