How to download GitHub Release from private repo using command line
Categories:
Download GitHub Releases from Private Repositories via Command Line

Learn how to programmatically download release assets from private GitHub repositories using curl and wget with personal access tokens.
Downloading release assets from public GitHub repositories is straightforward. However, accessing releases from private repositories requires authentication. This article will guide you through the process of using command-line tools like curl and wget to download these assets securely, leveraging GitHub Personal Access Tokens (PATs).
Understanding GitHub Releases and Authentication
GitHub Releases are a way to package and provide software to your users. They are based on Git tags and can include binaries, source code, and other files. For private repositories, accessing these files programmatically requires authentication. The recommended method for command-line access is using a Personal Access Token (PAT).
A Personal Access Token acts as an alternative password when using the GitHub API or Git over HTTPS. It's crucial to generate a PAT with the appropriate scopes to ensure it has the necessary permissions to access your private repositories and their releases. For downloading releases, the repo scope (or more specifically, repo:status, repo_deployment, public_repo if applicable) is generally required.
flowchart TD
A[Start]
A --> B{Generate GitHub PAT}
B --> C{Set PAT as Environment Variable}
C --> D{Construct API URL for Release Asset}
D --> E{Authenticate with PAT}
E --> F{Download Asset using curl/wget}
F --> G[End]Workflow for downloading private GitHub release assets
Generating a Personal Access Token (PAT)
Before you can download anything, you need a PAT. Follow these steps to create one with the correct permissions:
1. Navigate to GitHub Developer Settings
Go to your GitHub profile settings, then select 'Developer settings' from the sidebar.
2. Access Personal Access Tokens
Click on 'Personal access tokens' and then 'Tokens (classic)'.
3. Generate New Token
Click 'Generate new token' and choose 'Generate new token (classic)'.
4. Configure Token Details
Give your token a descriptive name (e.g., 'Release Downloader'). Set an expiration date (it's best practice to set a limited expiration). For scopes, select repo to grant full control of private repositories. If you need more granular control, ensure repo:status and public_repo are selected at a minimum for release access.
5. Save Your Token
Click 'Generate token'. Copy the token immediately as you won't be able to see it again. Store it securely.
Downloading Release Assets with curl
curl is a versatile command-line tool for transferring data with URLs. It's widely available on most Unix-like systems and can be used to download GitHub release assets by authenticating with your PAT.
First, you need to identify the API URL for the specific release asset you want to download. This is typically in the format:
https://api.github.com/repos/{owner}/{repo}/releases/assets/{asset_id}
To find the asset_id, you can list all assets for a specific release tag:
https://api.github.com/repos/{owner}/{repo}/releases/tags/{tag_name}
Or, to get the latest release:
https://api.github.com/repos/{owner}/{repo}/releases/latest
When you query these URLs, look for the browser_download_url or url field within the assets array. The url field is the API endpoint for the asset, which requires authentication and a specific Accept header. The browser_download_url is often a direct download link that might work without explicit authentication for public assets, but for private ones, it's safer to use the API endpoint with authentication.
# Set your GitHub Personal Access Token
export GITHUB_TOKEN="YOUR_PERSONAL_ACCESS_TOKEN"
# Repository details
OWNER="your-github-username-or-org"
REPO="your-private-repo-name"
TAG="v1.0.0" # Or 'latest' for the latest release
# 1. Get release information to find asset_id and download URL
# For a specific tag:
RELEASE_INFO=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/repos/$OWNER/$REPO/releases/tags/$TAG")
# For the latest release:
# RELEASE_INFO=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
# "https://api.github.com/repos/$OWNER/$REPO/releases/latest")
# Extract asset_id and file name (adjust 'name' and 'id' based on your asset)
ASSET_ID=$(echo "$RELEASE_INFO" | grep -oP '"id": \K\d+' | head -1)
ASSET_NAME=$(echo "$RELEASE_INFO" | grep -oP '"name": "\K[^"]+' | head -1)
# If you have multiple assets, you might need to parse more carefully
# Example: find asset with a specific name pattern
# ASSET_ID=$(echo "$RELEASE_INFO" | jq -r '.assets[] | select(.name | contains("my_app.zip")) | .id')
# ASSET_NAME=$(echo "$RELEASE_INFO" | jq -r '.assets[] | select(.name | contains("my_app.zip")) | .name')
if [ -z "$ASSET_ID" ]; then
echo "Error: Asset ID not found for tag $TAG in $OWNER/$REPO."
exit 1
fi
# 2. Download the asset using the API endpoint
# Note the 'Accept' header for raw binary data
curl -LJO -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/octet-stream" \
"https://api.github.com/repos/$OWNER/$REPO/releases/assets/$ASSET_ID"
echo "Downloaded $ASSET_NAME"
Bash script to download a specific release asset using curl.
-L flag in curl tells it to follow redirects, which is often necessary for GitHub API downloads. The -J flag uses the Content-Disposition header to infer the filename, and -O saves the file to the current directory.Downloading Release Assets with wget
wget is another popular command-line utility for retrieving content from web servers. It can also be used for downloading private GitHub release assets, though its authentication mechanism is slightly different from curl.
# Set your GitHub Personal Access Token
export GITHUB_TOKEN="YOUR_PERSONAL_ACCESS_TOKEN"
# Repository details
OWNER="your-github-username-or-org"
REPO="your-private-repo-name"
TAG="v1.0.0" # Or 'latest' for the latest release
# 1. Get release information to find asset_id and download URL
# For a specific tag:
RELEASE_INFO=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/repos/$OWNER/$REPO/releases/tags/$TAG")
# For the latest release:
# RELEASE_INFO=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
# "https://api.github.com/repos/$OWNER/$REPO/releases/latest")
# Extract asset_id and file name (adjust 'name' and 'id' based on your asset)
ASSET_ID=$(echo "$RELEASE_INFO" | grep -oP '"id": \K\d+' | head -1)
ASSET_NAME=$(echo "$RELEASE_INFO" | grep -oP '"name": "\K[^"]+' | head -1)
if [ -z "$ASSET_ID" ]; then
echo "Error: Asset ID not found for tag $TAG in $OWNER/$REPO."
exit 1
fi
# 2. Construct the download URL for wget
# wget doesn't handle the 'Accept: application/octet-stream' header directly for redirects
# It's often easier to get the 'browser_download_url' from the API response
# and then pass the Authorization header to wget.
# Extract browser_download_url for the specific asset
DOWNLOAD_URL=$(echo "$RELEASE_INFO" | jq -r ".assets[] | select(.id == $ASSET_ID) | .browser_download_url")
if [ -z "$DOWNLOAD_URL" ]; then
echo "Error: Download URL not found for asset ID $ASSET_ID."
exit 1
fi
# 3. Download the asset using wget
# Note: wget requires the --header for Authorization
wget --header="Authorization: token $GITHUB_TOKEN" \
--content-disposition \
"$DOWNLOAD_URL"
echo "Downloaded $ASSET_NAME"
Bash script to download a specific release asset using wget.
--content-disposition flag in wget tells it to use the filename suggested by the server in the Content-Disposition header, similar to curl -J.Both curl and wget provide robust ways to download files from private GitHub repositories. Choose the tool that best fits your environment and scripting preferences. Remember to always keep your Personal Access Tokens secure.