Git Beyond the Basics: Git Bundle and Archive
This is part 4 of a 6-part series on Git commands.
Git bundle and Git archive commands aren’t broadly known, but they can serve a variety of purposes. They 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
The Git archive command archives all the contents of the current HEAD into a file named HeadArchive.zip. Because the prefix option is given, it does this under a folder named “2014-10-21” in the archive. The available list of formats can be retrieved with the git archive --list command.
git archive --prefix=2014-10-21/ --format=zip HEAD >HeadArchive.zip
Using Git Bundle for Files and Their History
But the Git archive command includes only the files, not their history. For that, you want the Git 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 use Git bundle clone a new repository:
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 and list the contents.
By establishing a clear convention for tagging, the bundle command even makes it possible to transfer incremental changes regularly at a given time interval.