I have been trying to print git clone progress on more minimalistic way for my project.
Aim
Instead of printing a whole git clone output on screen
remote: Enumerating objects: 1845678, done. remote: Counting objects: 100% (503/503), done. remote: Compressing objects: 100% (79/79), done. Receiving objects: 28% (54112/1845678), 10.10 MiB | 2.00 MiB/s
I want to abstract the lengthy lines of git output and just want to output the realtime progress of clone in the given below format
Cloning [$percentage]
What I have got so far
git clone --progress https://somerepo 2>&1 |tee gitclone.file | tr \\r \\n | total="$(awk '/Receiving objects/{print $3}')" | echo "$total"
Note: Since git clone only returns to stderr stream, I have redirected it to stdout stream. Even with the redirection I faced few issues, so I used progress option on git command.
I wanted to store output on the file (for debugging script) without disturbing stdout stream, so I used tee command. Since git clone returns \r
instead of \n
, I have replaced it to capture the output in proper manner. For more info on this part you can take a look at this question and its answer Git produces output in realtime to a file but I'm unable to echo it out in realtime directly in a while loop
Then I pick a line which has the keyword Receiving objects and print/store third keyfield value of that line.
What is my problem
My command is working fine if I am not storing output of awk and just printing it on screen:
git clone --progress https://somerepo 2>&1 |tee gitclone.file | tr \\r \\n | awk '/Receiving objects/{print $3}'
But, I am unable to store the awk output in a shell variable and echo it back:
git clone --progress https://somerepo 2>&1 |tee gitclone.file | tr \\r \\n | total="$(awk '/Receiving objects/{print $3}')" | echo "$total"
So what could be a possible solution for this issue?