Skip to content
Snippets Groups Projects

Clone All Repos

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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!"
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment