|  | git-bundle(1) | 
|  | ============= | 
|  |  | 
|  | NAME | 
|  | ---- | 
|  | git-bundle - Move objects and refs by archive | 
|  |  | 
|  |  | 
|  | SYNOPSIS | 
|  | -------- | 
|  | [verse] | 
|  | '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 linkgit:git-clone[1] a new repository from a bundle, to use | 
|  | linkgit:git-fetch[1] to fetch from one, and to list the references | 
|  | contained within it with linkgit: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 linkgit: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 linkgit:git-pack-objects[1], and | 
|  | unbundled using the `--fix-thin` option to linkgit: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 linkgit:gitformat-bundle[5] for more details and the discussion of | 
|  | "thin pack" in linkgit: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 linkgit: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 | 
|  | linkgit: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 linkgit: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. linkgit: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 linkgit:gitfaq[7], section "TRANSFERS" for a discussion of the | 
|  | problems associated with file syncing across systems. | 
|  |  | 
|  | FILE FORMAT | 
|  | ----------- | 
|  |  | 
|  | See linkgit:gitformat-bundle[5]. | 
|  |  | 
|  | GIT | 
|  | --- | 
|  | Part of the linkgit:git[1] suite |