#!/bin/sh # linux-bundle-clone # ------------------ # Use this script to clone a Linux repository using a CDN-hosted bundle. # This is the recommended way to clone Linux in a CI environment where # the full repository needs to be cloned every time. [ "${REMOTE:=$1}" ] || { echo "Please specify the remote to clone" echo "Example: ${0} https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux master" exit 1 } [ "${TARGET:=$2}" ] || { echo "Please specify the target directory" echo "Example: ${0} https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux master" exit 1 } CHECKOUT=${3:-master} # You can also use "http" if you are behind a caching proxy and want to # benefit from a locally stored copy. Initial time to first byte may be # long if the CDN frontend doesn't have the copy of the bundle yet, but # repeat requests will use the cached CDN copy. # # NOTICE: Pick the tree that's likely to have most of the objects you want # We have mainline, stable, and linux-next bundles for you to choose #CDNBUNDLE="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/clone.bundle" #CDNBUNDLE="https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/clone.bundle" CDNBUNDLE="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle" # We'll put the bundle into a safe temp location, but WARNING -- it's a # 1Gb+ file, so if you have limited space in /tmp, you should consider # changing the path here. See "man mktemp". BUNDLELOCAL=$(mktemp /tmp/linux-bundle.XXXXXXXXXX) echo "Getting the bundle file" curl -L "${CDNBUNDLE}" -o "${BUNDLELOCAL}" || { echo "Getting the clone bundle failed." # clean up to not litter huge files around rm -f "${BUNDLELOCAL}" exit 1 } echo "Cloning from the bundle file" git clone "${BUNDLELOCAL}" "${TARGET}" || { echo "Cloning from bundle failed." echo "The bundle is in ${BUNDLELOCAL}" exit 1 } # We're done with the bundle now rm -f "${BUNDLELOCAL}" cd "${TARGET}" echo "Fetching latest objects" git remote set-url origin "${REMOTE}" git remote update origin git checkout "${CHECKOUT}"