Ricardo Ibarra
08/29/2025, 11:27 PMRuntimeError: Failed to clone repository with exit code 128.
This is the code:
if __name__ == "__main__":
# Check if required environment variables are set
bc_access_token = os.environ.get("BC_ACCESS_TOKEN")
github_repo = GitRepository(
url="<github http url>",
branch="main",
credentials=GitHubCredentials(token=bc_access_token),
)
I also test the PAT token access by connecting to it using the gh cli commands on mac and got this message:
paste your authentication token: *********************************************************************************************
- gh config set -h <http://github.com|github.com> git_protocol https
✓ Configured git protocol
✓ Logged in as <user>Marvin
08/29/2025, 11:27 PMMarvin
08/29/2025, 11:31 PMGitRepository and GitHubCredentials? (In Prefect 3.x, the typical path is to use the git_clone pull step with prefect_github.GitHubCredentials rather than a GitRepository class.)
Why this is happening
- The gh CLI login you tested is separate from git clone authentication. Unless your git is configured to use gh auth git-credential, a non-interactive git clone will not pick up gh auth. This is why gh can succeed but git clone (which Prefect uses under the hood) can fail with 128.
- In Prefect 3.x, the recommended path is to either:
- Use Flow.from_source(...).deploy(...) and configure pull steps for cloning, or
- Call the git_clone pull step directly with an access token or a GitHubCredentials block.
Fastest way to verify your token and URL on the same machine/container where the script runs
- Run this quick Python test to isolate the issue:
import os
from prefect.deployments.steps.pull import git_clone
from prefect_github import GitHubCredentials
# Make sure BC_ACCESS_TOKEN is set in THIS environment
token = os.environ.get("BC_ACCESS_TOKEN")
assert token, "BC_ACCESS_TOKEN not set in this environment"
git_clone(
repository="<https://github.com/OWNER/REPO.git>", # must be the full HTTPS URL
branch="main",
credentials=GitHubCredentials(token=token),
)
If this fails with 128, the error text in stderr usually clarifies whether it’s “authentication failed” or “repository not found”.
Common fixes for exit code 128 in this context
- URL must be HTTPS and include .git: <https://github.com/owner/repo.git>
- Token scope/authorization:
- For a classic PAT: ensure it has repo scope for private repos.
- For a fine-grained PAT: ensure the token is granted access to the specific repo with at least “Contents: Read”.
- If your org enforces SSO, make sure the token is SSO-authorized for that org.
- Environment mismatch: ensure BC_ACCESS_TOKEN is set in the environment where the Prefect worker/process runs (containers often miss local env vars).
- Don’t rely on gh auth unless you’ve configured git to use it:
- You’d need git config --global credential.helper '!gh auth git-credential' for git to reuse gh auth. Otherwise, pass the token explicitly as shown above.
- Submodules: if your repo has submodules and you set include_submodules=True, ensure those submodules also use HTTPS and are accessible with the same token.
Recommended Prefect 3.x patterns
- Programmatic pull (good for quick testing or ad hoc runs):
from prefect.deployments.steps.pull import git_clone
from prefect_github import GitHubCredentials
git_clone(
repository="<https://github.com/OWNER/REPO.git>",
branch="main",
credentials=GitHubCredentials(token=os.environ["BC_ACCESS_TOKEN"]),
)
- Deploy from source (recommended for deployments):
- Use Flow.from_source("<https://github.com/OWNER/REPO>", entrypoint="path/to/flow.py:my_flow") then deploy(...).
- Provide credentials via your project’s pull step config (in prefect.yaml) using the same git_clone step and GitHubCredentials block.
- Docs:
- prefect-github integration
- git pull steps API
- prefect.yaml (deployments)
If you can share:
- Your Prefect version
- Your imports for `GitRepository`/`GitHubCredentials`
- The full stderr from the 128 failure (or run the short git_clone snippet above and paste the error)
…I can pinpoint the exact fix.