Add git-bundle: move objects and references by archive
Some workflows require use of repositories on machines that cannot be
connected, preventing use of git-fetch / git-push to transport objects and
references between the repositories.
git-bundle provides an alternate transport mechanism, effectively allowing
git-fetch and git-pull to operate using sneakernet transport. `git-bundle
create` allows the user to create a bundle containing one or more branches
or tags, but with specified basis assumed to exist on the target
repository. At the receiving end, git-bundle acts like git-fetch-pack,
allowing the user to invoke git-fetch or git-pull using the bundle file as
the URL. git-fetch and git-ls-remote determine they have a bundle URL by
checking that the URL points to a file, but are otherwise unchanged in
operation with bundles.
The original patch was done by Mark Levedahl <mdl123@verizon.net>.
It was updated to make git-bundle a builtin, and get rid of the tar
format: now, the first line is supposed to say "# v2 git bundle", the next
lines either contain a prerequisite ("-" followed by the hash of the
needed commit), or a ref (the hash of a commit, followed by the name of
the ref), and finally the pack. As a result, the bundle argument can be
"-" now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-22 00:59:14 +00:00
|
|
|
git-bundle(1)
|
|
|
|
=============
|
|
|
|
|
|
|
|
NAME
|
|
|
|
----
|
|
|
|
git-bundle - Move objects and refs by archive
|
|
|
|
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
--------
|
|
|
|
'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 so the interactive git protocols (git, ssh,
|
2007-03-01 05:14:23 +00:00
|
|
|
rsync, http) cannot be used. This command provides support for
|
Add git-bundle: move objects and references by archive
Some workflows require use of repositories on machines that cannot be
connected, preventing use of git-fetch / git-push to transport objects and
references between the repositories.
git-bundle provides an alternate transport mechanism, effectively allowing
git-fetch and git-pull to operate using sneakernet transport. `git-bundle
create` allows the user to create a bundle containing one or more branches
or tags, but with specified basis assumed to exist on the target
repository. At the receiving end, git-bundle acts like git-fetch-pack,
allowing the user to invoke git-fetch or git-pull using the bundle file as
the URL. git-fetch and git-ls-remote determine they have a bundle URL by
checking that the URL points to a file, but are otherwise unchanged in
operation with bundles.
The original patch was done by Mark Levedahl <mdl123@verizon.net>.
It was updated to make git-bundle a builtin, and get rid of the tar
format: now, the first line is supposed to say "# v2 git bundle", the next
lines either contain a prerequisite ("-" followed by the hash of the
needed commit), or a ref (the hash of a commit, followed by the name of
the ref), and finally the pack. As a result, the bundle argument can be
"-" now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-22 00:59:14 +00:00
|
|
|
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 gitlink:git-fetch[1] and gitlink:git-pull[1]
|
|
|
|
after moving the archive by some means (i.e., by sneakernet). As no
|
|
|
|
direct connection between 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 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 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 gitlink:git-index-pack[1]
|
|
|
|
for storage in the repository, then prints the names of all
|
|
|
|
defined references. If a reflist is given, only references
|
|
|
|
matching those in the given list are printed. This command is
|
|
|
|
really plumbing, intended to be called only by
|
|
|
|
gitlink:git-fetch[1].
|
|
|
|
|
|
|
|
[git-rev-list-args...]::
|
2007-03-01 05:14:23 +00:00
|
|
|
A list of arguments, acceptable to git-rev-parse and
|
Add git-bundle: move objects and references by archive
Some workflows require use of repositories on machines that cannot be
connected, preventing use of git-fetch / git-push to transport objects and
references between the repositories.
git-bundle provides an alternate transport mechanism, effectively allowing
git-fetch and git-pull to operate using sneakernet transport. `git-bundle
create` allows the user to create a bundle containing one or more branches
or tags, but with specified basis assumed to exist on the target
repository. At the receiving end, git-bundle acts like git-fetch-pack,
allowing the user to invoke git-fetch or git-pull using the bundle file as
the URL. git-fetch and git-ls-remote determine they have a bundle URL by
checking that the URL points to a file, but are otherwise unchanged in
operation with bundles.
The original patch was done by Mark Levedahl <mdl123@verizon.net>.
It was updated to make git-bundle a builtin, and get rid of the tar
format: now, the first line is supposed to say "# v2 git bundle", the next
lines either contain a prerequisite ("-" followed by the hash of the
needed commit), or a ref (the hash of a commit, followed by the name of
the ref), and finally the pack. As a result, the bundle argument can be
"-" now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-22 00:59:14 +00:00
|
|
|
git-rev-list, that specify 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
|
2007-03-01 05:14:23 +00:00
|
|
|
expects to receive only those references asked for and not
|
Add git-bundle: move objects and references by archive
Some workflows require use of repositories on machines that cannot be
connected, preventing use of git-fetch / git-push to transport objects and
references between the repositories.
git-bundle provides an alternate transport mechanism, effectively allowing
git-fetch and git-pull to operate using sneakernet transport. `git-bundle
create` allows the user to create a bundle containing one or more branches
or tags, but with specified basis assumed to exist on the target
repository. At the receiving end, git-bundle acts like git-fetch-pack,
allowing the user to invoke git-fetch or git-pull using the bundle file as
the URL. git-fetch and git-ls-remote determine they have a bundle URL by
checking that the URL points to a file, but are otherwise unchanged in
operation with bundles.
The original patch was done by Mark Levedahl <mdl123@verizon.net>.
It was updated to make git-bundle a builtin, and get rid of the tar
format: now, the first line is supposed to say "# v2 git bundle", the next
lines either contain a prerequisite ("-" followed by the hash of the
needed commit), or a ref (the hash of a commit, followed by the name of
the ref), and finally the pack. As a result, the bundle argument can be
"-" now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-22 00:59:14 +00:00
|
|
|
necessarily everything in the pack (in this case, git-bundle is
|
|
|
|
acting like gitlink:git-fetch-pack[1]).
|
|
|
|
|
|
|
|
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, master --since=10.days.ago).
|
|
|
|
|
|
|
|
It is very important that the basis used be held by the destination.
|
2007-03-01 05:14:23 +00:00
|
|
|
It is okay to err on the side of conservatism, causing the bundle file
|
Add git-bundle: move objects and references by archive
Some workflows require use of repositories on machines that cannot be
connected, preventing use of git-fetch / git-push to transport objects and
references between the repositories.
git-bundle provides an alternate transport mechanism, effectively allowing
git-fetch and git-pull to operate using sneakernet transport. `git-bundle
create` allows the user to create a bundle containing one or more branches
or tags, but with specified basis assumed to exist on the target
repository. At the receiving end, git-bundle acts like git-fetch-pack,
allowing the user to invoke git-fetch or git-pull using the bundle file as
the URL. git-fetch and git-ls-remote determine they have a bundle URL by
checking that the URL points to a file, but are otherwise unchanged in
operation with bundles.
The original patch was done by Mark Levedahl <mdl123@verizon.net>.
It was updated to make git-bundle a builtin, and get rid of the tar
format: now, the first line is supposed to say "# v2 git bundle", the next
lines either contain a prerequisite ("-" followed by the hash of the
needed commit), or a ref (the hash of a commit, followed by the name of
the ref), and finally the pack. As a result, the bundle argument can be
"-" now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-22 00:59:14 +00:00
|
|
|
to contain objects already in the destination as these are ignored
|
|
|
|
when unpacking at the destination.
|
|
|
|
|
|
|
|
EXAMPLE
|
|
|
|
-------
|
|
|
|
|
|
|
|
Assume two repositories exist as R1 on machine A, and 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 developments made on branch master in R1.
|
|
|
|
We set a tag in R1 (lastR2bundle) after the previous such transport,
|
|
|
|
and move it afterwards to help build the bundle.
|
|
|
|
|
|
|
|
in R1 on A:
|
|
|
|
$ git-bundle create mybundle master ^lastR2bundle
|
|
|
|
$ git tag -f lastR2bundle master
|
|
|
|
|
|
|
|
(move mybundle from A to B by some mechanism)
|
|
|
|
|
|
|
|
in R2 on B:
|
|
|
|
$ git-bundle verify mybundle
|
|
|
|
$ git-fetch mybundle refspec
|
|
|
|
|
|
|
|
where refspec is refInBundle:localRef
|
|
|
|
|
|
|
|
|
|
|
|
Also, with something like this in your config:
|
|
|
|
|
|
|
|
[remote "bundle"]
|
|
|
|
url = /home/me/tmp/file.bdl
|
|
|
|
fetch = refs/heads/*:refs/remotes/origin/*
|
|
|
|
|
|
|
|
You can first sneakernet the bundle file to ~/tmp/file.bdl and
|
|
|
|
then these commands:
|
|
|
|
|
|
|
|
$ git ls-remote bundle
|
|
|
|
$ git fetch bundle
|
|
|
|
$ git pull bundle
|
|
|
|
|
|
|
|
would treat it as if it is talking with a remote side over the
|
|
|
|
network.
|
|
|
|
|
|
|
|
Author
|
|
|
|
------
|
|
|
|
Written by Mark Levedahl <mdl123@verizon.net>
|
|
|
|
|
|
|
|
GIT
|
|
|
|
---
|
|
|
|
Part of the gitlink:git[7] suite
|