Skip to content

Instantly share code, notes, and snippets.

@erdincay
Last active March 14, 2024 21:00
Show Gist options
  • Star 98 You must be signed in to star a gist
  • Fork 55 You must be signed in to fork a gist
  • Save erdincay/4f1d2e092c50e78ae1ffa39d13fa404e to your computer and use it in GitHub Desktop.
Save erdincay/4f1d2e092c50e78ae1ffa39d13fa404e to your computer and use it in GitHub Desktop.
su GitHub (downloading all repositories from a given user)
#!/bin/bash
if [ -z "$1" ]; then
echo "waiting for the following arguments: username + max-page-number"
exit 1
else
name=$1
fi
if [ -z "$2" ]; then
max=2
else
max=$2
fi
cntx="users"
page=1
echo $name
echo $max
echo $cntx
echo $page
until (( $page -lt $max ))
do
curl "https://api.github.com/$cntx/$name/repos?page=$page&per_page=100" | grep -e 'clone_url*' | cut -d \" -f 4 | xargs -L1 git clone
$page=$page+1
done
exit 0
@peelyKoodoo
Copy link

Thank you!

Only thing that tripped me up was that my terminal is authenticated with ssh, so I needed to switch clone_url for ssh_url. And also I got a syntax error on until (( $page -lt $max ) and $page=$page+1, I had to change them to until [ $page -gt $max ] and let "page=page+1". And, finally, I was cloneing the repos in my org, not my user, so I set cntx=orgs

Whole script being

#!/bin/zsh

if [ -z "$1" ]; then
    echo "waiting for the following arguments: username + max-page-number"
    exit 1
else
    name=$1
fi

if [ -z "$2" ]; then 
    max=2
else
    max=$2
fi

cntx="orgs"
page=1

echo $name
echo $max
echo $cntx
echo $page

until [ $page -gt $max ]
do 
    curl -i -u $name:$NPM_TOKEN "https://api.github.com/$cntx/$name/repos?page=$page&per_page=100" | grep -e 'ssh_url*' | cut -d \" -f 4 | xargs -L1 git clone
    let "page=page+1"
done

exit 0

@dkgndianko
Copy link

I did a similar thing with gh command.
You can see it there.

@Ricecr
Copy link

Ricecr commented Jul 2, 2023

"This is another solution":
page=$((page+1))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment