Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

7.2 KiB

Git mirror setup for faster submodule checkouts

TheRock has 14+ submodules including large repositories like llvm-project, rocm-libraries, and rocm-systems. The initial git submodule update --init can take 15-25 minutes over the network. By maintaining local bare mirror repositories, subsequent workspace setups across multiple checkouts become near-instant.

How it works

Git's --reference flag tells git clone to read objects from a local repository before fetching from the network. When a mirror contains the objects a submodule needs, the clone completes in seconds using local disk reads instead of network downloads.

Without mirrors:
  python fetch_sources.py
    -> fetches ~3GB+ for llvm-project from github.com       (10-20 min)
    -> repeats for each of the 14+ submodules

With mirrors (using fetch_sources.py --reference-dir):
  python fetch_sources.py --reference-dir ~/.rocm-git-mirrors
    -> selects the correct mirror for each submodule automatically
    -> reads most objects from local disk                    (~5 sec per submodule)
    -> fetches only missing objects (if any) from remote

The mirror directory layout follows the GitHub URL structure:

~/.rocm-git-mirrors/
└── ROCm
    ├── llvm-project.git
    ├── rocm-libraries.git
    ├── rocm-systems.git
    ├── half.git
    ├── HIPIFY.git
    ├── rocm-cmake.git
    ├── SPIRV-LLVM-Translator.git
    ├── rocprof-trace-decoder.git
    ├── mesa-fork.git
    ├── rocm-kpack.git
    ├── libhipcxx.git
    └── rocgdb.git

Quick start

cd TheRock

# Create mirrors for all submodules (one-time, takes 20-40 minutes)
python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir ~/.rocm-git-mirrors \
    --jobs 4

# Use mirrors when fetching sources
python3 ./build_tools/fetch_sources.py \
    --reference-dir ~/.rocm-git-mirrors

Linux setup

Initial mirror creation

# Choose a persistent location with enough disk space (~15-20 GB)
export THEROCK_GIT_MIRROR_DIR="$HOME/.rocm-git-mirrors"

# Create all mirrors (parallelized, with retry)
python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir "$THEROCK_GIT_MIRROR_DIR" \
    --jobs 4

Keeping mirrors up to date

Mirrors should be updated periodically so they stay close to the remote HEAD. The --update flag uses git ls-remote to check for new refs before fetching, skipping mirrors that are already current.

# Manual update
python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir "$THEROCK_GIT_MIRROR_DIR" \
    --update --jobs 4

To automate updates, add a cron job:

# Update mirrors every 4 hours
crontab -e

Add the following line (adjust paths as needed):

0 */4 * * * cd /path/to/TheRock && python3 ./build_tools/setup_git_mirrors.py --mirror-dir $HOME/.rocm-git-mirrors --update --jobs 4 >> /tmp/rocm-mirror-update.log 2>&1

Setting the environment variable

Add to your shell profile (~/.bashrc, ~/.zshrc, etc.):

export THEROCK_GIT_MIRROR_DIR="$HOME/.rocm-git-mirrors"

With this set, fetch_sources.py will automatically use the mirrors without needing --reference-dir on every invocation.

Windows setup

Initial mirror creation

Open a terminal (PowerShell or Git Bash) in the TheRock directory:

# Choose a persistent location
$env:THEROCK_GIT_MIRROR_DIR = "C:\rocm-git-mirrors"

# Create all mirrors
python ./build_tools/setup_git_mirrors.py `
    --mirror-dir $env:THEROCK_GIT_MIRROR_DIR `
    --jobs 4

Keeping mirrors up to date

python ./build_tools/setup_git_mirrors.py `
    --mirror-dir $env:THEROCK_GIT_MIRROR_DIR `
    --update --jobs 4

To automate via Task Scheduler:

  1. Open Task Scheduler
  2. Create a new Basic Task named "ROCm Mirror Update"
  3. Set the trigger to repeat every 4 hours
  4. Set the action to run:
    • Program: python
    • Arguments: C:\path\to\TheRock\build_tools\setup_git_mirrors.py --mirror-dir C:\rocm-git-mirrors --update --jobs 4
    • Start in: C:\path\to\TheRock

Setting the environment variable

Set it permanently via System Properties or PowerShell:

[System.Environment]::SetEnvironmentVariable(
    "THEROCK_GIT_MIRROR_DIR",
    "C:\rocm-git-mirrors",
    "User"
)

Usage with fetch_sources.py

Once mirrors are set up, there are two ways to use them:

export THEROCK_GIT_MIRROR_DIR="$HOME/.rocm-git-mirrors"

# fetch_sources.py picks it up automatically
python3 ./build_tools/fetch_sources.py --jobs 12

Option 2: Explicit flag

python3 ./build_tools/fetch_sources.py \
    --reference-dir ~/.rocm-git-mirrors \
    --jobs 12

Both options are fully backward compatible. If the mirror directory doesn't exist or a specific submodule's mirror is missing, fetch_sources.py falls back to normal network fetches automatically.

Verifying mirrors

Check that all mirrors are healthy:

python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir ~/.rocm-git-mirrors \
    --verify

Cleaning up stale mirrors

If submodules are removed from .gitmodules, prune orphaned mirrors:

python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir ~/.rocm-git-mirrors \
    --prune

Working with multiple workspaces

The primary benefit of mirrors is that multiple TheRock checkouts share the same object store. Once the mirrors are populated, creating a new workspace is fast:

# First workspace (mirrors already populated)
git clone https://github.com/ROCm/TheRock.git workspace-1
cd workspace-1
python3 ./build_tools/fetch_sources.py --reference-dir ~/.rocm-git-mirrors

# Second workspace (same mirrors, near-instant submodule init)
cd ..
git clone https://github.com/ROCm/TheRock.git workspace-2
cd workspace-2
python3 ./build_tools/fetch_sources.py --reference-dir ~/.rocm-git-mirrors

Troubleshooting

Mirror creation fails with network errors

The script retries failed operations up to 3 times with exponential backoff. To increase retries:

python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir ~/.rocm-git-mirrors \
    --retries 5

Submodule update fails with reference

If a --reference clone fails (e.g., corrupted mirror), fetch_sources.py automatically retries without --reference. You'll see a warning:

WARNING: --reference clone failed for compiler/amd-llvm, retrying without reference...

To fix the mirror, re-create it:

# Remove the bad mirror
rm -rf ~/.rocm-git-mirrors/ROCm/llvm-project.git

# Re-create it
python3 ./build_tools/setup_git_mirrors.py \
    --mirror-dir ~/.rocm-git-mirrors

Disk space

The full set of mirrors requires approximately 15-20 GB. The largest repositories are:

  • llvm-project (~3-4 GB)
  • rocm-libraries (~2-3 GB)
  • rocm-systems (~2-3 GB)
  • rocgdb (~1-2 GB)

What happens if mirrors become stale?

Stale mirrors still provide value. Git reads available objects from the mirror and fetches only the missing delta from the network. Even a mirror that's weeks old will still speed up submodule init significantly because most of the git history is already present locally.