|  | git-bundle(1) | 
|  | ============= | 
|  |  | 
|  | NAME | 
|  | ---- | 
|  | git-bundle - Move objects and refs by archive | 
|  |  | 
|  |  | 
|  | SYNOPSIS | 
|  | -------- | 
|  | [verse] | 
|  | 'git bundle' create <file> <git-rev-list-args> | 
|  | 'git bundle' verify <file> | 
|  | 'git bundle' list-heads <file> [<refname>...] | 
|  | 'git bundle' unbundle <file> [<refname>...] | 
|  |  | 
|  | DESCRIPTION | 
|  | ----------- | 
|  |  | 
|  | Some workflows require that one or more branches of development on one | 
|  | machine be replicated on another machine, but the two machines cannot | 
|  | be directly connected, and therefore the interactive Git protocols (git, | 
|  | ssh, http) cannot be used. This command provides support for | 
|  | 'git fetch' and 'git pull' to operate by packaging objects and references | 
|  | in an archive at the originating machine, then importing those into | 
|  | another repository using 'git fetch' and 'git pull' | 
|  | after moving the archive by some means (e.g., by sneakernet). As no | 
|  | direct connection between the repositories exists, the user must specify a | 
|  | basis for the bundle that is held by the destination repository: the | 
|  | bundle assumes that all objects in the basis are already in the | 
|  | destination repository. | 
|  |  | 
|  | OPTIONS | 
|  | ------- | 
|  |  | 
|  | create <file>:: | 
|  | Used to create a bundle named 'file'. This requires the | 
|  | 'git-rev-list-args' arguments to define the bundle contents. | 
|  |  | 
|  | 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. | 
|  | 'git bundle' prints a list of missing commits, if any, and exits | 
|  | with a non-zero status. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | 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'. | 
|  |  | 
|  | <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'). | 
|  |  | 
|  | SPECIFYING REFERENCES | 
|  | --------------------- | 
|  |  | 
|  | 'git bundle' will only package references that are shown by | 
|  | 'git show-ref': this includes heads, tags, and remote heads. References | 
|  | such as `master~1` cannot be packaged, but are perfectly suitable for | 
|  | defining the basis. More than one reference may be packaged, and more | 
|  | than one basis can be specified. The objects packaged are those not | 
|  | contained in the union of the given bases. Each basis can be | 
|  | specified explicitly (e.g. `^master~10`), or implicitly (e.g. | 
|  | `master~10..master`, `--since=10.days.ago master`). | 
|  |  | 
|  | It is very important that the basis used be held by the destination. | 
|  | 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. | 
|  |  | 
|  | 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 basis. 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 | 
|  | basis, 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 basis 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 basis: | 
|  |  | 
|  | ---------------- | 
|  | $ 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 | 
|  | ---------------- | 
|  |  | 
|  | GIT | 
|  | --- | 
|  | Part of the linkgit:git[1] suite |