web-dev-qa-db-fra.com

Comment faire en sorte que git produise une sortie dans un fichier?

Je voulais écrire la sortie de git clone dans un fichier en utilisant

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

Mais au lieu de cela, la sortie est affichée/mise à jour dans le terminal, comme

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.

Mais le fichier git_clone.file est généré mais reste vide.

Mon objectif initial était de contourner le résultat de git dans une fonction (voir ma question ici ). Mais maintenant, je me suis rendu compte que git ne semble même pas produire la sortie vers stdout réellement, mais en quelque sorte différent puisque rien n’est écrit dans le fichier.

Comment puis-je obtenir cette sortie affichée de git afin de la rediriger vers un fichier/une fonction?


EDIT

La redirection proposée de stderr (et stdout) n'a pas résolu le problème.

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

tous m'ont donné le même résultat: seule la ligne

Cloning to 'someRepository' ...

apparaît dans git_clone.file


INFORMATIONS GÉNÉRALES

Pourquoi ai-je besoin de ça?

Comme expliqué dans mon autre question ici J'ai écrit une barre de progression personnalisée toujours au bas de la sortie de mes scripts. (Je l'utilise dans plusieurs scripts mais) Le script dans ce cas migre beaucoup de dépôts (jusqu'à maintenant 107) git de github vers notre propre serveur Gitlab et répare le support Git LFS qui est généralement perdu. sans ça.

Donc, je voudrais tout de même voir toute la sortie de git mais j'aimerais aussi que ma barre de progression fonctionne au bas de la sortie dans le terminal.

2
derHugo

Merci de votre aide!


Je viens de trouver la solution:

Partie 1

(Merci au réponse du dessert )
git de par sa conception, n'écrivez jamais dans stdout mais stderr. J'ai donc eu besoin de rediriger stderr, aussi, afin d'obtenir la sortie en utilisant

_git clone XYZ &> git_clone.file
_

Partie 2

Quoi qu'il en soit, cela ne suffisait pas et je n'ai reçu que la partie "sans intérêt" de la sortie vers le fichier, mais pas les lignes de progression que je voulais vraiment.

Faire des recherches supplémentaires à nouveau dans man git-clone Je me suis rendu compte qu’il existe une option

_--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.
_

Bien que j’ai pensé qu’il était en réalité déjà attaché à un terminal, cela semble maintenant obliger git à écrire les lignes de la partie progrès qui m’intéresse le plus finalement à stderr afin que je puisse maintenant les obtenir avec

_git clone --progress XYZ &> git_clone.file
_
5
derHugo

git clone utilise stderr pour la sortie, écrivez donc simplement que dans le fichier:

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

Alternativement, vous pouvez rediriger les deux stdout et stderr - ce n'est pas nécessaire dans ce cas particulier, mais de cette façon, vous vous assurez que chaque sortie produite par la commande est redirigée :

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

Dans le cas de git clone, il est évident que si vous le redirigez, le résultat obtenu est différent. Toutes les informations de progression qui transitent dans le terminal ne sont pas incluses dans un fichier de sortie. Cela est voulu par la conception et le IIRC, vous ne pouvez pas facilement changer ce comportement directement cependant si vous avez besoin de la sortie dans un autre script, vous pouvez très bien le conduit , ce qui fonctionne très bien et vous donne tout le résultat:

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

Dans votre script, vous pouvez obtenir stdin avec -, par exemple. cat - pour imprimer stdin à stdout - voir ici pour plus d'informations: Comment écrire un script qui accepte les entrées d'un fichier ou de stdin? et Comment lire à partir d'un fichier ou stdin dans Bash? .

1
dessert