#+date: <2021-03-19> #+title: How to Clonse All Repositories from a GitHub or Sourcehut Account #+description: #+slug: clone-github-repos * Cloning from GitHub If you're like me and use a lot of different devices (and sometimes decide to just wipe your device and start with a new OS), you probably know the pain of cloning all your old code repositories down to your local file system. If you're using GitHub, you can easily clone all of your code back down in just seconds. First, create a bash script. I do so by opening a new file in =nano=, but you can use =gedit=, =vim=, or something else: #+begin_src sh nano clone_github_repos.sh #+end_src Next, paste in the following information. Note that you can replace the word =users= in the first line with =orgs= and type an organization's name instead of a user's name. #+begin_src sh CNTX=users; NAME=YOUR-USERNAME; PAGE=1 curl "https://api.github.com/$CNTX/$NAME/repos?page=$PAGE&per_page=100" | grep -e 'git_url*' | cut -d " -f 4 | xargs -L1 git clone #+end_src Finally, save the bash script and make it executable. #+begin_src sh chmod a+x clone_github_repos.sh #+end_src Now you can run the script and should see the cloning process begin. #+begin_src sh ./clone_github_repos.sh #+end_src * Cloning from Sourcehut I haven't fully figured out how to directly incorporate Sourcehut's GraphQL API into a bash script yet, so this one will take two steps. First, log-in to Sourcehut and go to their [[https://git.sr.ht/graphql][GraphQL playground for Git]]. Next, paste the following query into the left box: #+begin_src sh query { me { canonicalName repositories() { cursor results { name } } } } #+end_src The output on the right side will give you an object of all your repositories. Just grab that text and remove all the characters such as quotation marks and curly brackets. You will need a single-line list of space-separated values for the next step. Now let's create the bash script: #+begin_src sh nano clone_sourcehut_repos.sh #+end_src Next, paste the following bash script in with the list of repositories you obtained above and replace =your-username= with your username. Note that this uses the SSH-based Git cloning method (e.g. =git@git...=), so you'll need to ensure you have set up Sourcehut with your SSH key. #+begin_src sh repos=(repo1 repo2 repo3) # List all sub-directories in the current directory for repo in "${repos[@]}" do # Clone git clone git@git.sr.ht:~your-username/$repo done #+end_src Finally, save the bash script and make it executable. #+begin_src sh chmod a+x clone_sourcehut_repos.sh #+end_src Now you can run the script and should see the cloning process begin. #+begin_src sh ./clone_sourcehut_repos.sh #+end_src * Moving Repositories to a New Host Now that you have all of your code repositories cloned to your local computer, you may want to change the remote host (e.g., moving from GitHub to GitLab). To do this, let's create another bash script: #+begin_src sh nano change_remote_urls.sh #+end_src Past the following information and be sure to change the URL information to whichever host you are moving to. For this example, I am looping through all of my cloned GitHub directories and changing them to Sourcehut (e.g. == -> =git@git.sr.ht:~myusername=). #+begin_src sh # List all sub-directories in the current directory for dir in */ do # Remove the trailing "/" dir=${dir%*/} # Enter sub-directory cd $dir # Change remote Git URL git remote set-url origin /"${dir##*/}" # Push code to new remote git push # Go back to main directory cd .. done #+end_src Finally, save the bash script and make it executable. #+begin_src sh chmod a+x change_remote_urls.sh #+end_src Now you can run the script and should see the cloning process begin. #+begin_src sh ./change_remote_urls.sh #+end_src