Git Beyond the Basics: Git Bundle and Archive
This is part 4 of a 6-part series on Git commands.
Git’s bundle and archive commands aren’t broadly known, but they can serve a variety of purposes. Git bundle and Git archive both provide the means to output portions of a repository. The key distinction is what they include:
- Git archive sends only the specified file contents to the standard output.
- Git bundle creates a single file containing both file contents and history.
What’s the Difference Between Git Bundle and Git Archive?
The difference between Git bundle and Git archive is whether the contents of the .git folder are included. Git archive excludes the contents of the .git folder, while Git bundle includes it.
From a practical standpoint, the Git bundle and Git archive serve a variety of purposes. They can:
- Back up just the files in a single sourcetree (e.g., the head revision)
- Back up the entire repository
- Transfer a branch to secure machines that have no network connections
Using Git Archive for Files
Let's look at an example:
git archive --prefix=2014-10-21/ --format=zip HEAD >HeadArchive.zip
The above command will archive all the contents of the current HEAD into a file named HeadArchive.zip. And because the prefix option is given, it will do so under a folder named “2014-10-21” in the archive. The available list of formats can be retrieved with the git archive --list command. Many other options are also available, as explained by the Git Book documentation.
Using Git Bundle for Files and Their History
Of course that includes only the files; it doesn’t include their history. For that, you want the bundle command instead. Consider the following example:
git bundle create HeadBundle.git HEAD
That command will create a single file named HeadBundle.git that contains not only the entire file contents of the current HEAD, but it also includes all the history and versioning metadata as well. As such, a bundle serves as a complete copy of the specified data.
Using Git Bundle to Clone a New Repository
You can even clone a new repository from it:
git clone HeadBundle.git ~/test
That command will create a clone of the contents of the bundle in a new test folder. Other options let you verify the contents of a bundle, list the contents, and so forth.
By establishing a clear convention for tagging, the bundle command even makes it possible to transfer incremental changes regularly at a given time interval. For more information, consult the Git Book documentation.
Looking for more information on Git commands? Here are other Git Beyond the Basics posts that you might find helpful: