Estou escrevendo uma série de scripts para gerenciamento de Git no zsh.
Como verifico se o diretório atual é um repositório Git? (Quando não estou em um repositório Git, não quero executar vários comandos e obter várias fatal: Not a git repository
respostas).
$GIT_DIR
ou$GIT_WORK_TREE
variáveis de ambiente, ou como eles interagem.Respostas:
Copiado do arquivo de conclusão do bash, a seguir é uma maneira ingênua de fazer isso
Você pode agrupar isso em uma função ou usá-lo em um script.
Condensado em uma condição de uma linha adequada para bash e zsh
fonte
git rev-parse --is-inside-git-dir
. Eu pessoalmente usogit rev-parse --is-inside-work-tree
antes de definir meu PS1.--is-inside-git-dir
retornará true somente se você estiver realmente dentro do.git
diretório de um repositório. Não acho que o OP esteja procurando por isso.--is-inside-work-tree
nem--is-inside-git-dir
vai funcionar quando você está fora de um repositório git. consulte: groups.google.com/forum/#!topic/git-users/dWc23LFhWxE.git
. Para maior robustez, omita o[ -d .git ]
e apenas usegit rev-parse ...
.Você pode usar:
O que imprimirá 'true' se você estiver em uma árvore de trabalho de repositórios git.
Observe que ele ainda retorna a saída para STDERR se você estiver fora de um repositório git (e não imprimir 'false').
Retirado desta resposta: https://stackoverflow.com/a/2044714/12983
fonte
git rev-parse --show-toplevel
corresponde à subpasta que estou verificandoUse git rev-parse --git-dir
fonte
Ou você pode fazer isso:
fonte
-e
modo:[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
Não tenho certeza se existe uma maneira publicamente acessível / documentada de fazer isso (existem algumas funções internas do git que você pode usar / abusar na própria fonte git)
Você poderia fazer algo como;
fonte
Com base na resposta de @Alex Cory :
não contém nenhuma operação redundante e funciona no
-e
modogit rev-parse
êxito, ignorando sua saída.git
comandos são válidos apenas dentro de uma árvore de trabalho. Portanto, para fins de script, você provavelmente está interessado em estar não apenas dentro de um "repositório git", mas dentro de uma árvore de trabalho.fonte
[
nada. Basta fazerif git rev-parse --is-inside-work-tree; then ...
(com redirecionamentos como desejado.)Outra solução é verificar o código de saída do comando.
Isso imprimirá 1 se você estiver em uma pasta de repositório git.
fonte
.git
diretório - o que você pode ou não querer.git rev-parse 2>&-
.Esta resposta fornece uma função shell POSIX de exemplo e um exemplo de uso para complementar a resposta do @ jabbie .
git
retorna nível de erro0
se estiver dentro de um repositório git; caso contrário, retorna nível de erro128
. (Também retornatrue
oufalse
se estiver dentro de um repositório git.)Exemplo de uso
fonte
.git
, terá sucesso, mas será impressofalse
.git rev-parse --is-inside-work-tree
retornostrue
oufalse
então ele é dentro de um repositório git, e é isso que a função retorna. isto é, a função está correta #isso funciona para mim. Você ainda recebe os erros, mas eles são fáceis de suprimir. também funciona de dentro de subpastas!
status do git> / dev / null 2> & 1 && echo Olá, mundo!
Você pode colocar isso em uma instrução if then se precisar fazer mais condicionalmente.
fonte
git status
pode ser muito lento em um repo grande / antigo. Eu não o usaria para esse fim.Por que não usar códigos de saída? Se um repositório git existir no diretório atual, os comandos
git branch
egit tag
retornarão o código de saída 0; caso contrário, um código de saída diferente de zero será retornado. Dessa forma, você pode determinar se um repositório git existe ou não. Simplesmente, você pode executar:Vantagem : Flexibe. Ele funciona para repositórios vazios e não vazios e em sh, zsh e bash.
Explicação
git tag
: Obtendo tags do repositório para determinar se existe ou não.> /dev/null 2>&1
: Impedindo a impressão de qualquer coisa, incluindo saídas normais e de erro.[ $? -eq 0 ]
: Verifique se o comando anterior retornou com o código de saída 0 ou não. Como você deve saber, toda saída diferente de zero significa que algo de ruim aconteceu.$?
recebe o código de saída do comando anterior, e[
,-eq
e]
realizar a comparação.Como exemplo, você pode criar um arquivo nomeado
check-git-repo
com o seguinte conteúdo, torná-lo executável e executá-lo:fonte
# verifique se o git repo
fonte
[
aqui. Apenas faça:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
Obrigado ivan_pozdeev , Agora eu tenho um teste se dentro do diretório .git o código não será executado, para que não haja erros impressos ou status de saída falso.
O " ! [[$ (Pwd) = .git / || $ (pwd) = * .git]] " testa se você não está dentro de um repositório .git, então ele executa o comando git. O comando do tipo embutido é usado para verificar se você tem o git instalado ou se está dentro do seu PATH. ver tipo de ajuda
fonte
Que tal isso:
fonte
Você pode adicionar ou substituir seu $ PS1 no zshrc por uma ou outra ferramenta de prompt do git. Dessa forma, você pode ser convenientemente informado se está em um repositório git e se o estado do repositório está.
fonte
O ! nega, mesmo que você execute isso em um diretório que não seja um repositório git, ele não fornecerá alguns erros fatais
O > / dev / null 2> & 1 envia as mensagens para / dev / null, pois você está logo após o status de saída. O {} é para agrupamentos de comandos, portanto, todos os comandos após o || será executado se o git rev-parse for bem-sucedido, pois usamos a! que negou o status de saída do git rev-parse. O printf serve apenas para imprimir algumas mensagens e status git para imprimir o status do repositório.
Envolva-o em uma função ou coloque-o em um script. Espero que isto ajude
fonte
.git
, terá sucesso, mas será impressofalse
.