Merge branch 'ab/bundle-doc'
Doc update. * ab/bundle-doc: bundle doc: replace "basis" with "prerequsite(s)" bundle doc: elaborate on rev<->ref restriction bundle doc: elaborate on object prerequisites bundle doc: rewrite the "DESCRIPTION" sectionmaint
						commit
						f19b2752e7
					
				|  | @ -18,21 +18,48 @@ SYNOPSIS | ||||||
| DESCRIPTION | DESCRIPTION | ||||||
| ----------- | ----------- | ||||||
|  |  | ||||||
| Some workflows require that one or more branches of development on one | Create, unpack, and manipulate "bundle" files. Bundles are used for | ||||||
| machine be replicated on another machine, but the two machines cannot | the "offline" transfer of Git objects without an active "server" | ||||||
| be directly connected, and therefore the interactive Git protocols (git, | sitting on the other side of the network connection. | ||||||
| ssh, http) cannot be used. |  | ||||||
|  |  | ||||||
| The 'git bundle' command packages objects and references in an archive | They can be used to create both incremental and full backups of a | ||||||
| at the originating machine, which can then be imported into another | repository, and to relay the state of the references in one repository | ||||||
| repository using 'git fetch', 'git pull', or 'git clone', | to another. | ||||||
| after moving the archive by some means (e.g., by sneakernet). |  | ||||||
|  |  | ||||||
| As no | Git commands that fetch or otherwise "read" via protocols such as | ||||||
| direct connection between the repositories exists, the user must specify a | `ssh://` and `https://` can also operate on bundle files. It is | ||||||
| basis for the bundle that is held by the destination repository: the | possible linkgit:git-clone[1] a new repository from a bundle, to use | ||||||
| bundle assumes that all objects in the basis are already in the | linkgit:git-fetch[1] to fetch from one, and to list the references | ||||||
| destination repository. | 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. | ||||||
|  |  | ||||||
|  | See the "EXAMPLES" section below for examples of how to use bundles. | ||||||
|  |  | ||||||
|  | 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 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, 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 link:technical/bundle-format.html[the `bundle-format` | ||||||
|  | documentation] for more details and the discussion of "thin pack" in | ||||||
|  | link:technical/pack-format.html[the pack format documentation] for | ||||||
|  | further details. | ||||||
|  |  | ||||||
| OPTIONS | OPTIONS | ||||||
| ------- | ------- | ||||||
|  | @ -117,28 +144,88 @@ unbundle <file>:: | ||||||
| SPECIFYING REFERENCES | SPECIFYING REFERENCES | ||||||
| --------------------- | --------------------- | ||||||
|  |  | ||||||
| 'git bundle' will only package references that are shown by | Revisions must accompanied by reference names to be packaged in a | ||||||
| 'git show-ref': this includes heads, tags, and remote heads.  References | bundle. | ||||||
| such as `master~1` cannot be packaged, but are perfectly suitable for |  | ||||||
| defining the basis.  More than one reference may be packaged, and more | More than one reference may be packaged, and more than one set of prerequisite objects can | ||||||
| than one basis can be specified.  The objects packaged are those not | be specified.  The objects packaged are those not contained in the | ||||||
| contained in the union of the given bases.  Each basis can be | union of the prerequisites. | ||||||
| specified explicitly (e.g. `^master~10`), or implicitly (e.g. |  | ||||||
| `master~10..master`, `--since=10.days.ago master`). | 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 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 | 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 | to contain objects already in the destination, as these are ignored | ||||||
| when unpacking at the destination. | when unpacking at the destination. | ||||||
|  |  | ||||||
| `git clone` can use any bundle created without negative refspecs |  | ||||||
| (e.g., `new`, but not `old..new`). |  | ||||||
| If you want to match `git clone --mirror`, which would include your | If you want to match `git clone --mirror`, which would include your | ||||||
| refs such as `refs/remotes/*`, use `--all`. | refs such as `refs/remotes/*`, use `--all`. | ||||||
| If you want to provide the same set of refs that a clone directly | If you want to provide the same set of refs that a clone directly | ||||||
| from the source repository would get, use `--branches --tags` for | from the source repository would get, use `--branches --tags` for | ||||||
| the `<git-rev-list-args>`. | 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 | EXAMPLES | ||||||
| -------- | -------- | ||||||
|  |  | ||||||
|  | @ -149,7 +236,7 @@ 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. | 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 | 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 | 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 | processed, in order to make it easy to later update the other repository | ||||||
| with an incremental bundle: | with an incremental bundle: | ||||||
|  |  | ||||||
|  | @ -200,7 +287,7 @@ machineB$ git pull | ||||||
|  |  | ||||||
| If you know up to what commit the intended recipient repository should | If you know up to what commit the intended recipient repository should | ||||||
| have the necessary objects, you can use that knowledge to specify the | 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 | 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 | 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 | 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: | the linkgit:git-log[1] command. Here are more examples: | ||||||
|  | @ -211,7 +298,7 @@ You can use a tag that is present in both: | ||||||
| $ git bundle create mybundle v1.0.0..master | $ git bundle create mybundle v1.0.0..master | ||||||
| ---------------- | ---------------- | ||||||
|  |  | ||||||
| You can use a basis based on time: | You can use a prerequisite based on time: | ||||||
|  |  | ||||||
| ---------------- | ---------------- | ||||||
| $ git bundle create mybundle --since=10.days master | $ git bundle create mybundle --since=10.days master | ||||||
|  | @ -224,7 +311,7 @@ $ git bundle create mybundle -10 master | ||||||
| ---------------- | ---------------- | ||||||
|  |  | ||||||
| You can run `git-bundle verify` to see if you can extract from a bundle | You can run `git-bundle verify` to see if you can extract from a bundle | ||||||
| that was created with a basis: | that was created with a prerequisite: | ||||||
|  |  | ||||||
| ---------------- | ---------------- | ||||||
| $ git bundle verify mybundle | $ git bundle verify mybundle | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano