Skip to content

Instantly share code, notes, and snippets.

@vke-code
Created September 12, 2018 21:39
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 20 You must be signed in to fork a gist
  • Save vke-code/fda27b3ae617e733f3d28e939caee22f to your computer and use it in GitHub Desktop.
Save vke-code/fda27b3ae617e733f3d28e939caee22f to your computer and use it in GitHub Desktop.
#!/bin/bash
# Clone all github.com repositories for a specified user.
if [ $# -eq 0 ]
then
echo "Usage: $0 <user_name> "
exit;
fi
USER=$1
# clone all repositories for user specifed
for repo in `curl -s https://api.github.com/users/$USER/repos?per_page=1000 |grep git_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/'`;do
git clone $repo;
done;
@vke-code
Copy link
Author

thank you

Wow, I thought this would be a gist that only I use! I am so glad this is useful for someone else!

@RohitM-IN
Copy link

thanks man

@danilofreire
Copy link

Thanks a lot! It's very a very useful little script!

@davidvandenbor
Copy link

Hi vke-code! 😄
The script doesn't seem to work in my setup (terminal on Mac OSX)
I can execute the script, but it doesn't seem to return anything.

  1. open terminal
  2. cd to folder where I want to download repo's
  3. type: "sh" and then the path to the sh file, like so:
  4. "sh /path/to/download-all-repos.sh"
  5. after hitting RETURN the terminal responds with:
  6. "Usage: /path/to/download-all-repos/download-all-repos.sh <user_name>"
  7. ??????????

And that's it. Nothing happens after this.

Cheers and thanks in advance,
David!

@vke-code
Copy link
Author

vke-code commented May 6, 2021

@davidvandenbor

Thanks for trying out my gist. You need to additionally specify the username whose repos you'd like to download.

e.g. to download all of your repos:
sh /path/to/download-all-repos.sh davidvandenbor

@davidvandenbor
Copy link

davidvandenbor commented May 6, 2021

Hi vke-code!

IT WORKED!!
Now I know what the problem was, I misunderstood the error message in your sh file and interpreted it as:

type the username inside the bash script (replace <user_name> inside de sh code with github username)

Modification

I modified your sh file to make it a bit more clearer for future users who aren't as familiar with bash scripts. I also modified the error notification that appears if you don't type the Github username:

#!/bin/bash

# This BASH script clones all github.com repositories for a specified user!
# HOW TO USE THE SCRIPT: 
# CD to the directory where you want to download all the repositories (or open terminal there)
# then execute the script by defining the path to where you saved the .sh file, followed by your Github username:
# "sh the/path/to/download-all-repos.sh <github_user_name_here>"
# Then hit RETURN and watch the magic happen

if [ $# -eq 0 ]
  then
    echo "ERROR: Github username is missing, you shoud type THIS in your terminal: "
    echo "$0 <github_user_name_here> "
    exit;
fi

USER=$1

# clone all repositories for specified user:
for repo in `curl -s https://api.github.com/users/$USER/repos?per_page=1000 |grep git_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/'`;do
git clone $repo;
done;

@dhruvparekh12
Copy link

dhruvparekh12 commented Aug 5, 2021

?per_page=1000 seems to have been limited to 99 repos only by the github API. Alternatively, we can substitute the query_param with ?page=1. This is will return 30 repos on a page by page basis. Changing ?page=2,?page=3 and so on we can get repos beyond the limit of 99.

Here's what I simply did to get the remaining repos beyond 99.

#!/bin/bash

# Clone all github.com repositories for a specified user.

if [ $# -eq 0 ]
  then
    echo "Usage: $0 <user_name> "
    exit;
fi

USER=$1

# clone all repositories for user specified
for repo in `curl -s https://api.github.com/users/$USER/repos?page=4 |grep git_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/'`;do
git clone $repo;
done;

# clone all repositories for user specified
for repo in `curl -s https://api.github.com/users/$USER/repos?page=5 |grep git_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/'`;do
git clone $repo;
done;

for repo in `curl -s https://api.github.com/users/$USER/repos?page=6 |grep git_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/'`;do
git clone $repo;
done;

@Pierre-Mike
Copy link

Thanks :)

@andjohn
Copy link

andjohn commented Jan 6, 2023

its needs to replace git_url to clone_url

#!/bin/bash

# This BASH script clones all github.com repositories for a specified user!
# HOW TO USE THE SCRIPT: 
# CD to the directory where you want to download all the repositories (or open terminal there)
# then execute the script by defining the path to where you saved the .sh file, followed by your Github username:
# "sh the/path/to/download-all-repos.sh <github_user_name_here>"
# Then hit RETURN and watch the magic happen

if [ $# -eq 0 ]
  then
    echo "ERROR: Github username is missing, you shoud type THIS in your terminal: "
    echo "$0 <github_user_name_here> "
    exit;
fi

USER=$1

# clone all repositories for specified user:
for repo in `curl -s https://api.github.com/users/$USER/repos?per_page=1000 |grep clone_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/'`;do
git clone $repo;
done;

@ioritz1993
Copy link

ioritz1993 commented Jul 22, 2023

Thanks a lot ! I have added a new functionality.

The added functionality allows for two different actions, depending on the state of the repository.

  1. Cloning non-existent repositories
  2. Pulling existing repositories

The code with the changes is here:
https://gist.github.com/ioritz1993/be12fd85fb3fd7a502d01597e8a9bd62

@A-Makeyev
Copy link

#!/bin/bash

This BASH script clones all github.com repositories for a specified user!

HOW TO USE THE SCRIPT:

CD to the directory where you want to download all the repositories (or open terminal there)

then execute the script by defining the path to where you saved the .sh file, followed by your Github username:

"sh the/path/to/download-all-repos.sh <github_user_name_here>"

Then hit RETURN and watch the magic happen

if [ $# -eq 0 ]
then
echo "ERROR: Github username is missing, you shoud type THIS in your terminal: "
echo "$0 <github_user_name_here> "
exit;
fi

USER=$1

clone all repositories for specified user:

for repo in curl -s https://api.github.com/users/$USER/repos?per_page=1000 |grep clone_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/';do
git clone $repo;
done;

Dam thats awesome thanks

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