DEV Community

Cover image for git bundle
Gabriel Guzman
Gabriel Guzman

Posted on

git bundle

I had an interesting problem at work the other day. We'd hired some external contractors to build an android app for us, and now we needed to get the code from them and into our private GitHub. The problem was, I couldn't quickly get them access to the repo since there's a fair amount of process involved in getting those approvals. They also didn't have enough seats to add me as a contributor to their GitHub account, and so we were stuck with me asking them to send a .zip file with the code. Instead, they came back to me with a git bundle file, which I'd never heard of (though I've been using git for a long time now). A git bundle file is essentially a full repository in a single file. You can have branches, history, tags, basically everything you expect in a repository, but it's all contained in a single file. This makes sharing the repository or moving the full repository pretty straightforward. Assume I have a git project called myproj, and I want to send that to someone else.

host1$ cd myproj
host1$ git bundle create repo.bundle master
Enter fullscreen mode Exit fullscreen mode

That will make a bundle file (repo.bundle) that contains all the history of the master branch. You can then send this file to a friend, and they can clone it just like if it were a remote git origin:

host2$ git clone -b master ./repo.bundle myproj
host2$ cd myproj
host2$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
Enter fullscreen mode Exit fullscreen mode

Another pretty neat thing about git bundles is, if you need to update one, you can send an incremental file update with only the latest changes. The recipient just puts that in place of their existing bundle, and runs git pull w/in their repo.

This isn't something you'd use every day, but in certain situations (like getting a git repo from one place to another w/out being able to share a remote origin) it works great!

More info on git bundle: https://git-scm.com/docs/git-bundle

Top comments (19)

Collapse
 
hungluong profile image
Hung Luong

This is great! Now we just have to upload the file on a server then share it so others can download it then pull or update changes from/to their machines. Let's call it GitClub... oh wait...

jk, this is super useful to me :D

Collapse
 
gabeguz profile image
Gabriel Guzman

Hahahahah

Collapse
 
gregorybodnar profile image
Greg Bodnar

I wish I was aware of this a few months ago. We ended up sharing a repo inside a corporate dropbox, so everyone sees a steady stream of updates to index files and occasionally can't push because someone checked out the shared repo to a branch. Using a bundle instead of a normal repo would have solved those issues quite neatly.

Collapse
 
ferricoxide profile image
Thomas H Jones II

Been using git's bundle functionality for a couple years to keep private (read-only) repositories in sync with public (cardinal) repositories. Much more space-efficient when you're trying to push repo-updates over network-links that are limited-bandwidth - both in absolute bits-per-second and in maximum payload-size.

Collapse
 
droidmakk profile image
Afroze Kabeer Khan. M

I literally didn't see that coming.. 😁

Collapse
 
sambenskin profile image
Sam Benskin

Never heard of that, but it sounds like it could be useful in a pinch. Perhaps it also has some (very basic) backup applications, if you want to easily create a backup of a single branch. Thanks for sharing!

Collapse
 
ahmedmusallam profile image
Ahmed Musallam

Oh man! This is probably the best way to migrate a repo between providers that do not have integration and especially self-hosted ones.

Usually you’d have to clone and chickout all branches then push them to a new remote. Bit this is much easier! Thank you for sharing!

Collapse
 
juliavii profile image
juliavii

Never ever heard about that. Is going to save my ass in a not distant future for sure. Now I am thinking if could have any difference when working with gitlab and/or github migration.

Great work!

Collapse
 
gabeguz profile image
Gabriel Guzman

Thanks, yeah it was new for me as well! Not something I'll use every day, but definitely good to know about.

Collapse
 
tmcsquared profile image
TMcSquared

That's pretty neat!

Collapse
 
seyedk profile image
sk

One of the best ways to describe bundles. Thank you @gabeguz !

Collapse
 
offendingcommit profile image
Jonathan Irvin

Mind, blown.

Collapse
 
khavelemarline profile image
marlinekhavele

This has saved me today...Thank You

Collapse
 
developinpython profile image
pydev

Very useful! Thank you!
I actually needed something like this on an offline server not long ago!

Collapse
 
ar234 profile image
Ahmad R

Very useful! Thanks Gabriel

Collapse
 
pratikaambani profile image
Pratik Ambani • Edited

...and I was doing it manually all these years. Seriously

Collapse
 
kurtz1993 profile image
Luis Hernández

Thank you for sharing!
This is one of those things I'd loved to use in the past 😁