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.
Merci de votre aide!
Je viens de trouver la solution:
(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
_
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
_
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? .