Em um Makefile, eu gostaria de executar determinadas ações se houver alterações não confirmadas (na árvore de trabalho ou no índice). Qual é a maneira mais limpa e eficiente de fazer isso? Um comando que sai com um valor de retorno zero em um caso e diferente de zero no outro seria adequado para meus propósitos.
Posso correr git status
e canalizar a saída grep
, mas sinto que deve haver uma maneira melhor.
Respostas:
ATUALIZAÇÃO : o OP Daniel Stutzbach ressalta nos comentários que esse comando simples
git diff-index
funcionou para ele:( nornagon menciona nos comentários que, se houver arquivos que foram tocados, mas cujo conteúdo é o mesmo do índice, você precisará executar
git update-index --refresh
antesgit diff-index
, caso contráriodiff-index
, informará incorretamente que a árvore está suja)Você pode ver " Como verificar se um comando foi bem-sucedido? " Se você o estiver usando em um script bash:
Nota: como comentado por Anthony Sottile
E
haridsv
ressalta nos comentários quegit diff-files
em um novo arquivo não o detecta como um diff.A abordagem mais segura parece ser executada
git add
primeiro nas especificações do arquivo e depois usadagit diff-index
para verificar se alguma coisa foi adicionada ao índice antes da execuçãogit commit
.E 6502 relata nos comentários:
Esses problemas de carimbo de data e hora também podem ocorrer se o git estiver sendo executado na janela de encaixe .
Resposta original:
"Programaticamente" significa nunca confiar em comandos de porcelana .
Sempre confie nos comandos de encanamento .
Consulte também " Verificando se há um índice sujo ou arquivos não rastreados com o Git " para obter alternativas (como
git status --porcelain
)Você pode se inspirar na nova "
require_clean_work_tree
função " que está escrita enquanto falamos ;) (início de outubro de 2010)fonte
git diff-index --quiet HEAD
.HEAD
no diretório de trabalho. Melhor usogit diff-index --quiet HEAD --
.git status --help
estados: --porcelain Forneça a saída em um formato fácil de analisar para scripts. Isso é semelhante à saída curta, mas permanecerá estável nas versões do Git e independentemente da configuração do usuário. Veja abaixo para detalhes.Embora as outras soluções sejam muito completas, se você quiser algo realmente rápido e sujo, tente algo como isto:
Apenas verifica se há alguma saída no resumo do status.
fonte
[[ ... ]]
sintaxe está realmente fazendo? Eu nunca vi nada assim antes.git status
é realmente ignorado neste teste. Ele olha apenas para a saída. Confira esta página relacionada festa para mais informações sobre[
,[[
e como testar obras em bash.--porcelain
do parâmetro como mostrado aquigit status -s -uall
para incluir arquivos não rastreados.git diff --exit-code
retornará diferente de zero se houver alguma alteração;git diff --quiet
é o mesmo sem saída. Como você deseja verificar a árvore de trabalho e o índice, useOu
Qualquer um deles dirá se há alterações não confirmadas, preparadas ou não.
fonte
git diff --quite HEAD
único informa apenas se a árvore de trabalho está limpa, não se o índice está limpo. Por exemplo, sefile
foi alterado entre HEAD ~ e HEAD, depoisgit reset HEAD~ -- file
será finalizado 0, mesmo havendo alterações faseadas presentes no índice (wt == HEAD, mas índice! = HEAD).git diff --quiet && git diff --cached --quiet
.Expandindo a resposta de @ Nepthar:
fonte
$(git status -s "$file")
e, em seguida, naelse
cláusulagit add "$file"; git commit -m "your autocommit process" "$file"
git status -s
umagit status --porcelain ; git clean -nd
vez, diretórios lixo será tona também aqui, que são invisíveis paragit status
.Como apontado em outra resposta, o simples comando é suficiente:
Se você omitir os dois últimos traços, o comando falhará se você tiver um arquivo chamado
HEAD
.Exemplo:
Palavra de cautela: este comando ignora arquivos não rastreados.
fonte
git add
egit clean
para o resgateEu criei alguns aliases úteis do git para listar arquivos em estágios e em etapas:
Então você pode facilmente fazer coisas como:
Você pode torná-lo mais legível criando um script em algum lugar
PATH
chamadogit-has
:Agora os exemplos acima podem ser simplificados para:
Para completar, aqui estão aliases semelhantes para arquivos não rastreados e ignorados:
fonte
Com python e o pacote GitPython:
Retorna True se o repositório não estiver limpo
fonte
LOGLEVEL=DEBUG
, verá todos os comandos do Popen usando-o para executargit diff
Aqui está a melhor e mais limpa maneira.
fonte
git status
é um comando de "porcelana". Não use comandos de porcelana nos scripts, pois eles podem mudar entre as versões do git. Em vez disso, use os comandos 'encanamento'.git status --porcelain
(que é para esse fim - um formato estável que você pode analisar em um script), possivelmente também com -z (nulo-separado em vez de nova linha?), Você poderia fazer algo útil com essa ideia . @ codyc4321 consulte stackoverflow.com/questions/6976473/… para obter detalhes