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.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 68 insertions(+), 0 deletions(-) create mode 100755 git-unbundle.sh diff --git a/git-unbundle.sh b/git-unbundle.sh new file mode 100755 index 0000000..c947f15 --- /dev/null +++ b/git-unbundle.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# unpack a git-bundle file into current repository +# +# See git-bundle. + +USAGE="usage: git-unbundle [-f|--force] [file]" +SUBDIRECTORY_OK=1 +. git-sh-setup + +bfile=bundle.tar +force= +while case "$#" in 0) break ;; esac +do + case "$1" in + -f|--f|--fo|--for|--forc|--force) + force=1;; + -h|--h|--he|--hel|--help) + usage;; + -*) + die "unknown option: $1";; + *) + bfile="$1";; + esac + shift +done + +test -e "$bfile" || die "cannot find $bfile" + +# Get prereqs and refs in one go to avoid a third tar invocation. +# Have a header line with version, prereqs, then references. +references=$(tar -xf "$bfile" --to-stdout references) +refdata=${references##v1*prerequisites} +test "$references" = "$refdata" && die "This doesn't look like a v1 bundle file." +prereqs="${refdata%%references*}" +refs="${refdata#*references}" + +# make sure prerequisites are available +test -n "$prereqs" && printf "%s\n" $prereqs | \ + git-rev-list --stdin --not --all || exit 1 + +# get the pack file +tar -xf "$bfile" --to-stdout pack | git-index-pack --stdin || exit 1 + +# check each reference, avoid non-fast forward update unless forced +printf "%s %s\n" $refs | while read sha1 ref ; do + ok= + if test -z "$force" ; then + # update only if non-fastforward + local=$(git-rev-parse --verify "$ref^0" 2>/dev/null) + if test -n "$local" ; then + mb=$(git-merge-base $local $sha1) + if test "$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 test -n "$ok" ; then + echo "updating: $ref to $sha1" + git-update-ref -m "git-unbundle update" $ref $sha1 + fi +done -- 1.5.0.rc4.375.gd0938-dirty - 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