Skip to content

Instantly share code, notes, and snippets.

@nelsonjchen
Forked from clrung/clone_all_repos.sh
Last active April 6, 2021 20:04
Show Gist options
  • Save nelsonjchen/49df538cafeb7c537db96b97e7b2d9bf to your computer and use it in GitHub Desktop.
Save nelsonjchen/49df538cafeb7c537db96b97e7b2d9bf to your computer and use it in GitHub Desktop.
Clones all repos in a GitHub organization (for input into GNU parallel)
#!/bin/bash
# Usage: clone_all_repos.sh [organization] <output directory>
ORG=$1
PER_PAGE=100
GIT_OUTPUT_DIRECTORY=${2:-"/tmp/${ORG}_repos"}
if [ -z "$GITHUB_TOKEN" ]; then
# https://github.com/settings/tokens
echo -e "Variable GITHUB_TOKEN isn't set! Please specify your GitHub token.\n\nMore info: https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/"
exit 1
fi
if [ -z "$ORG" ]; then
echo "Variable ORG isn't set! Please specify the GitHub organization."
exit 1
fi
mkdir -p $GIT_OUTPUT_DIRECTORY
echo "Cloning repos in $ORG to $GIT_OUTPUT_DIRECTORY/..."
echo "" > commands.parallel
for ((PAGE=1; ; PAGE+=1)); do
REPO_COUNT=0
ERROR=0
while read REPO_NAME ; do
((REPO_COUNT++))
echo -n "Cloning $REPO_NAME to $GIT_OUTPUT_DIRECTORY/$REPONAME... "
echo "git clone --depth=1 git@github.com:$ORG/$REPO_NAME.git $GIT_OUTPUT_DIRECTORY/$REPO_NAME" >> commands.parallel
echo "done"
done < <(curl -u :$GITHUB_TOKEN -s "https://api.github.com/orgs/$ORG/repos?per_page=$PER_PAGE&page=$PAGE" | jq -r ".[]|.name")
if [ $ERROR -eq 1 ] ; then exit 1 ; fi
if [ $REPO_COUNT -ne $PER_PAGE ] ; then exit 0 ; fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment