Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
GIT-BUNDLE(1)			  Git Manual			 GIT-BUNDLE(1)

NAME
       git-bundle - Move objects and refs by archive

SYNOPSIS
       git bundle create [-q | --quiet | --progress]
			   [--version=<version>] <file>	<git-rev-list-args>
       git bundle verify [-q | --quiet]	<file>
       git bundle list-heads <file> [<refname>...]
       git bundle unbundle [--progress]	<file> [<refname>...]

DESCRIPTION
       Create, unpack, and manipulate "bundle" files. Bundles are used for the
       "offline" transfer of Git objects without an active "server" sitting on
       the other side of the network connection.

       They can	be used	to create both incremental and full backups of a
       repository (see the "full backup" example in "EXAMPLES"), and to	relay
       the state of the	references in one repository to	another	(see the
       second example).

       Git commands that fetch or otherwise "read" via protocols such as
       ssh:// and https:// can also operate on bundle files. It	is possible
       git-clone(1) a new repository from a bundle, to use git-fetch(1)	to
       fetch from one, and to list the references contained within it with
       git-ls-remote(1). There's no corresponding "write" support, i.e.	a git
       push into a bundle is not supported.

BUNDLE FORMAT
       Bundles are .pack files (see git-pack-objects(1)) with a	header
       indicating what references are contained	within the bundle.

       Like the	packed archive format itself bundles can either	be
       self-contained, or be created using exclusions. See the "OBJECT
       PREREQUISITES" section below.

       Bundles created using revision exclusions are "thin packs" created
       using the --thin	option to git-pack-objects(1), and unbundled using the
       --fix-thin option to git-index-pack(1).

       There is	no option to create a "thick pack" when	using revision
       exclusions, and users should not	be concerned about the difference. By
       using "thin packs", bundles created using exclusions are	smaller	in
       size. That they're "thin" under the hood	is merely noted	here as	a
       curiosity, and as a reference to	other documentation.

       See gitformat-bundle(5) for more	details	and the	discussion of "thin
       pack" in	gitformat-pack(5) for further details.

OPTIONS
       create [options]	<file> <git-rev-list-args>
	   Used	to create a bundle named file. This requires the
	   <git-rev-list-args> arguments to define the bundle contents.
	   options contains the	options	specific to the	git bundle create
	   subcommand. If file is -, the bundle	is written to stdout.

       verify <file>
	   Used	to check that a	bundle file is valid and will apply cleanly to
	   the current repository. This	includes checks	on the bundle format
	   itself as well as checking that the prerequisite commits exist and
	   are fully linked in the current repository. Then, git bundle	prints
	   a list of missing commits, if any. Finally, information about
	   additional capabilities, such as "object filter", is	printed. See
	   "Capabilities" in gitformat-bundle(5) for more information. The
	   exit	code is	zero for success, but will be nonzero if the bundle
	   file	is invalid. If file is -, the bundle is	read from stdin.

       list-heads <file>
	   Lists the references	defined	in the bundle. If followed by a	list
	   of references, only references matching those given are printed
	   out.	If file	is -, the bundle is read from stdin.

       unbundle	<file>
	   Passes the objects in the bundle to git index-pack for storage in
	   the repository, then	prints the names of all	defined	references. If
	   a list of references	is given, only references matching those in
	   the list are	printed. This command is really	plumbing, intended to
	   be called only by git fetch.	If file	is -, the bundle is read from
	   stdin.

       <git-rev-list-args>
	   A list of arguments,	acceptable to git rev-parse and	git rev-list
	   (and	containing a named ref,	see SPECIFYING REFERENCES below), that
	   specifies the specific objects and references to transport. For
	   example, master~10..master causes the current master	reference to
	   be packaged along with all objects added since its 10th ancestor
	   commit. There is no explicit	limit to the number of references and
	   objects that	may be packaged.

       [<refname>...]
	   A list of references	used to	limit the references reported as
	   available. This is principally of use to git	fetch, which expects
	   to receive only those references asked for and not necessarily
	   everything in the pack (in this case, git bundle acts like git
	   fetch-pack).

       --progress
	   Progress status is reported on the standard error stream by default
	   when	it is attached to a terminal, unless -q	is specified. This
	   flag	forces progress	status even if the standard error stream is
	   not directed	to a terminal.

       --version=<version>
	   Specify the bundle version. Version 2 is the	older format and can
	   only	be used	with SHA-1 repositories; the newer version 3 contains
	   capabilities	that permit extensions.	The default is the oldest
	   supported format, based on the hash algorithm in use.

       -q, --quiet
	   This	flag makes the command not to report its progress on the
	   standard error stream.

SPECIFYING REFERENCES
       Revisions must be accompanied by	reference names	to be packaged in a
       bundle. Alternatively --all can be used to package all refs.

       More than one reference may be packaged,	and more than one set of
       prerequisite objects can	be specified. The objects packaged are those
       not contained in	the union of the prerequisites.

       The git bundle create command resolves the reference names for you
       using the same rules as git rev-parse --abbrev-ref=loose. Each
       prerequisite can	be specified explicitly	(e.g. ^master~10), or
       implicitly (e.g.	master~10..master, --since=10.days.ago master).

       All of these simple cases are OK	(assuming we have a "master" and
       "next" branch):

	   $ git bundle	create master.bundle master
	   $ echo master | git bundle create master.bundle --stdin
	   $ git bundle	create master-and-next.bundle master next
	   $ (echo master; echo	next) |	git bundle create master-and-next.bundle --stdin

       And so are these	(and the same but omitted --stdin examples):

	   $ git bundle	create recent-master.bundle master~10..master
	   $ git bundle	create recent-updates.bundle master~10..master next~5..next

       A revision name or a range whose	right-hand-side	cannot be resolved to
       a reference is not accepted:

	   $ git bundle	create HEAD.bundle $(git rev-parse HEAD)
	   fatal: Refusing to create empty bundle.
	   $ git bundle	create master-yesterday.bundle master~10..master~5
	   fatal: Refusing to create empty bundle.

OBJECT PREREQUISITES
       When creating bundles it	is possible to create a	self-contained bundle
       that can	be unbundled in	a repository with no common history, as	well
       as providing negative revisions to exclude objects needed in the
       earlier parts of	the history.

       Feeding a revision such as new to git bundle create will	create a
       bundle file that	contains all the objects reachable from	the revision
       new. That bundle	can be unbundled in any	repository to obtain a full
       history that leads to the revision new:

	   $ git bundle	create full.bundle new

       A revision range	such as	old..new will produce a	bundle file that will
       require the revision old	(and any objects reachable from	it) to exist
       for the bundle to be "unbundle"-able:

	   $ git bundle	create full.bundle old..new

       A self-contained	bundle without any prerequisites can be	extracted into
       anywhere, even into an empty repository,	or be cloned from (i.e., new,
       but not old..new).

       It is okay to err on the	side of	caution, causing the bundle file to
       contain objects already in the destination, as these are	ignored	when
       unpacking at the	destination.

       If you want to provide the same set of refs that	a clone	directly from
       the source repository would get,	use --branches --tags for the
       <git-rev-list-args>.

       The git bundle verify command can be used to check whether your
       recipient repository has	the required prerequisite commits for a
       bundle.

EXAMPLES
       We'll discuss two cases:

	1. Taking a full backup	of a repository

	2. Transferring	the history of a repository to another machine when
	   the two machines have no direct connection

       First let's consider a full backup of the repository. The following
       command will take a full	backup of the repository in the	sense that all
       refs are	included in the	bundle:

	   $ git bundle	create backup.bundle --all

       But note	again that this	is only	for the	refs, i.e. you will only
       include refs and	commits	reachable from those refs. You will not
       include other local state, such as the contents of the index, working
       tree, the stash,	per-repository configuration, hooks, etc.

       You can later recover that repository by	using for example git-
       clone(1):

	   $ git clone backup.bundle <new directory>

       For the next example, assume you	want to	transfer the history from a
       repository R1 on	machine	A to another repository	R2 on machine B. For
       whatever	reason,	direct connection between A and	B is not allowed, but
       we can move data	from A to B via	some mechanism (CD, email, etc.). We
       want to update R2 with development made on the branch master in R1.

       To bootstrap the	process, you can first create a	bundle that does not
       have any	prerequisites. You can use a tag to remember up	to what	commit
       you last	processed, in order to make it easy to later update the	other
       repository with an incremental bundle:

	   machineA$ cd	R1
	   machineA$ git bundle	create file.bundle master
	   machineA$ git tag -f	lastR2bundle master

       Then you	transfer file.bundle to	the target machine B. Because this
       bundle does not require any existing object to be extracted, you	can
       create a	new repository on machine B by cloning from it:

	   machineB$ git clone -b master /home/me/tmp/file.bundle R2

       This will define	a remote called	"origin" in the	resulting repository
       that lets you fetch and pull from the bundle. The $GIT_DIR/config file
       in R2 will have an entry	like this:

	   [remote "origin"]
	       url = /home/me/tmp/file.bundle
	       fetch = refs/heads/*:refs/remotes/origin/*

       To update the resulting mine.git	repository, you	can fetch or pull
       after replacing the bundle stored at /home/me/tmp/file.bundle with
       incremental updates.

       After working some more in the original repository, you can create an
       incremental bundle to update the	other repository:

	   machineA$ cd	R1
	   machineA$ git bundle	create file.bundle lastR2bundle..master
	   machineA$ git tag -f	lastR2bundle master

       You then	transfer the bundle to the other machine to replace
       /home/me/tmp/file.bundle, and pull from it.

	   machineB$ cd	R2
	   machineB$ git pull

       If you know up to what commit the intended recipient repository should
       have the	necessary objects, you can use that knowledge to specify the
       prerequisites, giving a cut-off point to	limit the revisions and
       objects that go in the resulting	bundle.	The previous example used the
       lastR2bundle tag	for this purpose, but you can use any other options
       that you	would give to the git-log(1) command. Here are more examples:

       You can use a tag that is present in both:

	   $ git bundle	create mybundle	v1.0.0..master

       You can use a prerequisite based	on time:

	   $ git bundle	create mybundle	--since=10.days	master

       You can use the number of commits:

	   $ git bundle	create mybundle	-10 master

       You can run git-bundle verify to	see if you can extract from a bundle
       that was	created	with a prerequisite:

	   $ git bundle	verify mybundle

       This will list what commits you must have in order to extract from the
       bundle and will error out if you	do not have them.

       A bundle	from a recipient repository's point of view is just like a
       regular repository which	it fetches or pulls from. You can, for
       example,	map references when fetching:

	   $ git fetch mybundle	master:localRef

       You can also see	what references	it offers:

	   $ git ls-remote mybundle

DISCUSSION
       A naive way to make a full backup of a repository is to use something
       to the effect of	cp -r <repo> <destination>. This is discouraged	since
       the repository could be written to during the copy operation. In	turn
       some files at <destination> could be corrupted.

       This is why it is recommended to	use Git	tooling	for making repository
       backups,	either with this command or with e.g. git-clone(1). But	keep
       in mind that these tools	will not help you backup state other than refs
       and commits. In other words they	will not help you backup contents of
       the index, working tree,	the stash, per-repository configuration,
       hooks, etc.

       See also	gitfaq(7), section "TRANSFERS" for a discussion	of the
       problems	associated with	file syncing across systems.

FILE FORMAT
       See gitformat-bundle(5).

GIT
       Part of the git(1) suite

Git 2.49.0			  2025-03-14			 GIT-BUNDLE(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=git-bundle&sektion=1&manpath=FreeBSD+Ports+14.3.quarterly>

home | help