Como obter o git produzindo saída para um arquivo?

0

Eu queria gravar a saída de git clone em um arquivo usando

git clone https://github.com/someRepository > git_clone.file

Mas, em vez disso, recebo a saída exibida / atualizada no terminal como

Cloning to 'someRepository' ...
remote: Counting objects: 2618, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 2618 (delta 2), reused 12 (delta 1), pack-reused 2603
Received objects: 100% (2618/2618), 258.95 MiB | 4.39 MiB/s, Done.
Resolving Differences auf: 100% (1058/1058), Done.
Check Connectivity ... Done.

Mas o arquivo git_clone.file é gerado, mas permanece vazio.

Meu objetivo original era ignorar a saída de git em uma função (consulte minha pergunta aqui ). Mas agora eu percebi que git nem parece produzir a saída para stdout de verdade, mas de alguma forma diferente, já que nada é gravado no arquivo.

Como posso obter essa saída exibida em git para redirecioná-la para um arquivo / função?

EDITAR

O redirecionamento proposto de stderr (e stdout ) não resolveu o problema.

git clone https://github.com/someRepository 2> git_clone.file
git clone https://github.com/someRepository &> git_clone.file
git clone https://github.com/someRepository > git_clone.file > 2>&1

todos me deram o mesmo resultado: apenas a linha

Cloning to 'someRepository' ...

aparece em git_clone.file

INFORMAÇÕES DE FUNDO

Por que preciso disso?

Como explicado em minha outra pergunta aqui eu escrevi uma barra de progresso personalizada sempre na parte inferior da saída dos meus scripts. (Eu uso em scripts multi-funcionais, mas) O script neste caso migra muito (até agora 107) git repositórios do github para o nosso próprio Gitlab-Server e repara o suporte do Git LFS que geralmente é perdido sem ele.

Então, eu ainda gostaria de ver toda a saída do git, mas também gostaria de ter minha barra de progresso trabalhando na parte inferior da saída no terminal.

    
por derHugo 23.12.2017 / 21:11

2 respostas

2

Obrigado pela sua ajuda!

Acabei de encontrar a solução:

Parte 1

(Graças à resposta da sobremesa )
git do design nunca escreve para stdout mas stderr . Então eu precisei redirecionar stderr também para obter a saída usando

git clone XYZ &> git_clone.file

Parte 2

De qualquer forma, isso não foi suficiente e eu só recebi a parte "desinteressante" da saída para o arquivo, mas não as linhas do progresso que eu realmente queria.

Fazer mais pesquisas novamente em man git-clone Percebi que existe uma opção

--progress
        progress status is reported on the standard error stream by 
        default when it is attached to a terminal, unless -q is 
        specified. This flag forces progress status even if the standard 
        error stream is not directed to a terminal.

Ainda que eu ache que ele já tenha sido anexado a um terminal, isso agora parece forçar git a escrever as linhas da parte de progresso que eu estou mais interessado finalmente em stderr , assim eu posso agora obtê-las usando

git clone --progress XYZ &> git_clone.file
    
por derHugo 23.12.2017 / 22:43
0

git clone usa stderr para a saída, então escreva no arquivo:

git clone https://github.com/someRepository 2>git_clone.file

Alternativamente, você pode redirecionar os dois stdout e stderr - isso não é necessário neste particular, mas desta forma você garante que todas as saídas sejam produzidas pelo comando redirecionado:

git clone https://github.com/someRepository &>git_clone.file

No caso de git clone , obviamente, há uma saída diferente, se você a redirecionar, todas as informações de progresso que passam pelo terminal não são incluídas em um arquivo de saída. Isso é por design e IIRC você não pode facilmente mudar esse comportamento diretamente, no entanto se você precisar da saída em outro script você pode muito bem canalizar para ele, que funciona apenas bem e dá-lhe toda a saída:

git clone https://github.com/someRepository | cat

Dentro do seu script, você pode obter stdin com - , por exemplo cat - para imprimir stdin para stdout - veja aqui para saber mais: Como escrever um script que aceite entrada de um arquivo ou de stdin? e Como ler de um arquivo ou stdin no Bash? .

    
por dessert 23.12.2017 / 21:15