Clone All Repos
The snippet can be accessed without any authentication.
Authored by
Dmytro Bogatov
Edited
clone-all.sh 1.53 KiB
#!/usr/bin/env bash
# run with
# curl -s https://git.dbogatov.org/-/snippets/52/raw/master/clone-all.sh | BASE=~/Desktop PAT=token bash -s -- --pull
set -e
GITLAB_SERVER=git.dbogatov.org
if [ -z "$PAT" ]
then
echo "Must set PAT env variable to personal access token"
exit 1
fi
if [ -z "$BASE" ]
then
echo "Must set BASE env variable to base path (e.g. ~/Desktop)"
exit 1
fi
PULL=false
if [[ $* == *--pull* ]]
then
PULL=true
fi
cd $BASE
RESPONSE=$(
curl \
--head -s \
--header "PRIVATE-TOKEN: $PAT" \
"https://${GITLAB_SERVER}/api/v4/projects?simple=true&per_page=20" \
| grep -Fi -e "x-total-pages" -e "x-total" \
| tr '\r' ' '
)
COUNT=$(echo $RESPONSE | cut -d' ' -f2)
PAGES=$(echo $RESPONSE | cut -d' ' -f4)
echo "Total ${COUNT} in ${PAGES} pages"
counter=1
for i in $(seq 1 1 ${PAGES})
do
echo "Page $i of $PAGES"
readarray -t projects < <(
curl \
-s \
--header "PRIVATE-TOKEN: $PAT" \
"https://${GITLAB_SERVER}/api/v4/projects?simple=true&membership=true&page=$i&per_page=20" \
| jq -r -c '.[] | .path_with_namespace'
)
for project in "${projects[@]}"
do
if [ -d "$project/.git" ]
then
if [[ $PULL = true ]]
then
echo "Pulling $project ($counter of $COUNT)"
cd $project
git pull || true
cd $BASE
sleep 4
else
echo "$project already cloned ($counter of $COUNT)"
fi
else
echo "Cloning $project ($counter of $COUNT)"
mkdir -p $project
cd $project
git clone git@$GITLAB_SERVER:$project.git .
cd $BASE
sleep 4
fi
((counter=counter+1))
done
done
echo "Done!"
Please register or sign in to comment