--- /dev/null
+#!/bin/bash
+
+# This script will sync github.com/llvm/llvm-project with
+# github.com/llvm/llvm-project-release-prs and try to merge
+# the changes in the release branch.
+
+set -e
+set -x
+
+# We should always get the branch from the environment.
+# But otherwise just default to something. We can probably
+# have a better default here?
+RELEASE_BRANCH="${RELEASE_BRANCH:-release/16.x}"
+
+# We will add two remotes here:
+# main - which will point to the main llvm-project repo
+# release - which will point to the release-prs repo
+# The remotes will use random strings to avoid
+# collisions
+MAIN_REMOTE=$(uuidgen)
+RELEASE_REMOTE=$(uuidgen)
+CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
+
+git remote add $MAIN_REMOTE "https://github.com/llvm/llvm-project"
+git remote add $RELEASE_REMOTE "https://github.com/llvm/llvm-project-release-prs"
+
+# Make sure we are up to date on all our repos first
+git fetch $MAIN_REMOTE
+git fetch $RELEASE_REMOTE
+
+# Create our sync branch. Starting with the main
+# repo first since it's important to get those
+# changes
+MERGE_BRANCH=$(uuidgen)
+git switch -c $MERGE_BRANCH $MAIN_REMOTE/$RELEASE_BRANCH
+
+# Merge changes from the release repo
+git merge --ff-only $RELEASE_REMOTE/$RELEASE_BRANCH
+
+if ! git diff-index --quiet $MAIN_REMOTE/$RELEASE_BRANCH; then
+ echo "Changes in the release remote - pushing to main remote"
+ git push $MAIN_REMOTE $MERGE_BRANCH:$RELEASE_BRANCH
+fi
+
+# Before we merge back into the release repo
+# let's update to make sure nothing has been
+# pushed to either repo while we do this work.
+# Most of the time this won't do anything, and
+# the real solution would instead be to fetch
+# in a loop if pushing fails. But that's a very
+# tiny edge-case, so let's not complicate this.
+git fetch $MAIN_REMOTE
+git fetch $RELEASE_REMOTE
+
+# And merge all the new data to the current branch
+git merge --ff-only $MAIN_REMOTE/$RELEASE_BRANCH
+
+# If anything changed let's merge it
+if ! git diff-index --quiet $RELEASE_REMOTE/$RELEASE_BRANCH; then
+ echo "Changes in main - pushing to release"
+ git push $RELEASE_REMOTE $MERGE_BRANCH:$RELEASE_BRANCH
+fi
+
+# Cleanup - enable for debug
+if false; then
+ git remote remove $RELEASE_REMOTE
+ git remote remove $MAIN_REMOTE
+
+ git switch $CURRENT_BRANCH
+ git branch -D $MERGE_BRANCH
+fi