git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Add git-unbundle - unpack objects and references for disconnected transfer

From
Mark Levedahl <mdl123@verizon.net>
Date
Feb 16, 2007, 00:19 UTC
Message-ID
<11715851973802-git-send-email-mdl123@verizon.net>
In-Reply-To
<11715851972838-git-send-email-mdl123@verizon.net>

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@verizon.net>
---
 git-unbundle.sh |   67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 67 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..ca13305
--- /dev/null
+++ b/git-unbundle.sh
@@ -0,0 +1,67 @@
+#!/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
+
+[ -e "$bfile" ] || die "cannot find $bfile"
+
+# Get prereqs and refs in one go to avoid a third tar invocation.
+# Prereqs come first, are separated by a single - from the actual refs.
+refdata=$(tar -f "$bfile" -x --to-stdout  .gitBundleReferences)
+prereqs="${refdata%%-*}"
+refs="${refdata#*-}"
+
+# check that the prerequisites exist before unbundling.
+for sha1 in $prereqs ; do
+	git-rev-parse --verify $sha1 >& /dev/null || die "Prerequisite commit $sha1 not found."
+done
+
+# get the objects, maybe repack
+tar -f "$bfile" -x --to-stdout .gitBundlePack | git-index-pack --stdin
+
+# check each reference, assure that the result would be valid before updating local ref
+printf "%s %s\n" $refs | while read sha1 ref ; do
+	ok=
+	if [ -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.34.g6afaa
Previous: Mark LevedahlNext: Mark Levedahl
Message 3 of 22 in “Respun - Scripts to use bundles to move data between repos”
  1. Mark LevedahlFeb 16, 2007
  2. Add git-bundle - pack objects and references for disconnected transferMark Levedahl, Feb 16, 2007
  3. Add git-unbundle - unpack objects and references for disconnected transferMark Levedahl, Feb 16, 2007
  4. Include git-bundle and git-unbundle in Makefile.Mark Levedahl, Feb 16, 2007
  5. Create documentation for git-bundle.Mark Levedahl, Feb 16, 2007
  6. Create documentation for git-unbundle.Mark Levedahl, Feb 16, 2007
  7. Link git-bundle and git-unbundle docs from git(7).Mark Levedahl, Feb 16, 2007
  8. Junio C HamanoFeb 16, 2007
  9. Linus TorvaldsFeb 16, 2007
  10. Add git-unbundle - unpack objects and references for disconnected transferMark Levedahl, Feb 16, 2007
  11. Shawn O. PearceFeb 16, 2007
  12. Junio C HamanoFeb 16, 2007
  13. Shawn O. PearceFeb 16, 2007
  14. Mark LevedahlFeb 16, 2007
  15. Junio C HamanoFeb 16, 2007
  16. Junio C HamanoFeb 16, 2007
  17. Shawn O. PearceFeb 16, 2007
  18. Junio C HamanoFeb 16, 2007
  19. Add git-bundle - pack objects and references for disconnected transferMark Levedahl, Feb 16, 2007
  20. Shawn O. PearceFeb 16, 2007
  21. Simon 'corecode' SchubertFeb 16, 2007
  22. Shawn O. PearceFeb 16, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.