Keeping git repositories in sync is usually and easily done using git pull and git push. However, for those rare times when you don’t have network connectivity (or limited connectivity) and still need to transfer the contents of a repository to somewhere else, there’s git bundle.
The bundle command creates an archive from one or more objects in a repository. I usually just take the entire master branch. For advanced cases, see the man page. For a simple case, do as follows.
In the source repository, use
git bundle to create the archive:
$ git bundle create /path/to/file.bundle refs/heads/master Counting objects: 935, done. Delta compression using up to 8 threads. Compressing objects: 100% (712/712), done. Writing objects: 100% (935/935), 1.72 MiB, done. Total 935 (delta 441), reused 585 (delta 202)
Note that uncommitted changes won’t be included, since they are not
pointed to by the tree reference (
master in this case). Now transfer
the archive to its destination. In the destination repository, do:
$ git ls-remote /path/to/file.bundle e615fea0972f6eccb870cfe67e146a8e21f3ee7d refs/heads/master
refs/heads/master reference won’t do in the destination
repository, as there is such a reference already. Therefore, we need to
fetch with a mapping:
$ git fetch /path/to/file.bundle refs/heads/master:refs/remotes/master From /path/to/file.bundle * [new branch] master -> master
Finally, we can merge into our existing master branch:
$ git merge refs/remotes/master Updating aaf4c61..e615fea Checking out files: 100% (442/442), done. ...
That’s all there is to it (for the simple case)! Happy bundling!
Update (2012-06-12): Changed the bundle-creating command to use