December 4, 2014

Git Beyond the Basics: Git Bundle and Archive

Git at Scale

This is part 4 of a 6-part series on Git commands.

git beyond the basics

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:

  1. Git archive sends only the specified file contents to the standard output.
  2. 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.

Keep reading

Looking for more information on Git commands? Here are other Git Beyond the Basics posts that you might find helpful: