Some workflows require coordinated development between repositories on machines that can never be connected. This utility unpacks a bundle containing objects and associated references (heads or tags) into the current repository, effectively supporting git-push like operations between disconnected systems. Signed-off-by: Mark Levedahl <mdl123@xxxxxxxxxxx> --- git-unbundle | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 75 insertions(+), 0 deletions(-) create mode 100755 git-unbundle diff --git a/git-unbundle b/git-unbundle new file mode 100755 index 0000000..5ea4ae6 --- /dev/null +++ b/git-unbundle @@ -0,0 +1,75 @@ +#!/bin/sh +# unpack a git-bundle file into current repository +# +# See git-bundle. + +die() { + echo >&2 "$@" + exit 1 +} + +bfile=bundle.zip +force= +shallow= +while case "$#" in 0) break ;; esac +do + case "$1" in + --bare) + export GIT_DIR=.;; + -f|--f|--fo|--for|--forc|--force) + force=1;; + -h|--h|--he|--hel|--help) + echo "usage: git-unbundle [--bare] [-f|--force] [--shallow] [bundle (default is bundle.zip)]" + exit;; + -s|--s|--sh|--sha|--shal|--shall|--shallo|--shallow) + shallow=1;; + -*) + die "unknown option: $1";; + *) + bfile="$1";; + esac + shift +done + +[ -e "$bfile" ] || die "cannot find $bfile" +GIT_DIR=$(git-rev-parse --git-dir) || die "Not in a git directory" + +# get the objects +unzip -p "$bfile" .gitBundlePack | git-unpack-objects + +# check each reference, assure that the result would be valid before updating local ref +unzip -p "$bfile" .gitBundleReferences | while read sha1 ref ; do + if [ -z "$shallow" ] ; then + result=$(git fsck $sha1) + havemissing=$(echo "$result" | grep '^missing') + else + # accept a shallow transfer + havemissing= + fi + ok= + if [ ! -z "$havemissing" ] ; then + echo "Not updating: $ref to $sha1" + echo "Bundle does not contain all required objects. (possibly partial) errors:" + echo "$result" | head + elif [ -z "$force" ] ; then + # update only if non-fastforward + local=$(git-rev-parse --verify "$ref^0" 2>/dev/null) + if [ ! -z "$local" ] ; then + mb=$(git-merge-base $local $sha1) + if [ "$mb" != "$local" ] ; then + echo "Not applying non-fast forward update: $ref" + else + ok=1 + fi + else + ok=1 + fi + else + #forced, accept non-fast forward update + ok=1 + fi + if [ ! -z "$ok" ] ; then + echo "updating: $ref to $sha1" + git-update-ref -m "git-unbundle update" $ref $sha1 + fi +done -- 1.5.0.rc3.24.g0c5e - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html