The git annex sync command provides an easy way to keep several repositories in sync.

Often git is used in a centralized fashion with a central bare repository which changes are pulled and pushed to using normal git commands. That works fine, if you don't mind having a central repository.

But it can be harder to use git in a fully decentralized fashion, with no central repository and still keep repositories in sync with one another. You have to remember to pull from each remote, and merge the appopriate branch after pulling. It's difficult to push to a remote, since git does not allow pushes into the currently checked out branch.

git annex sync makes it easier using a scheme devised by Joachim Breitner. The idea is to have a branch synced/master (actually, synced/$currentbranch), that is never directly checked out, and serves as a drop-point for other repositories to use to push changes.

When you run git annex sync, it merges the synced/master branch into master, receiving anything that's been pushed to it. Then it fetches from each remote, and merges in any changes that have been made to the remotes too. Finally, it updates synced/master to reflect the new state of master, and pushes it out to each of the remotes.

This way, changes propagate around between repositories as git annex sync is run on each of them. Every repository does not need to be able to talk to every other repository; as long as the graph of repositories is connected, and git annex sync is run from time to time on each, a given change, made anywhere, will eventually reach every other repository.

The workflow for using git annex sync is simple:

  • Make some changes to files in the repository, using git-annex, or anything else.
  • Run git annex sync to save the changes.
  • Next time you're working on a different clone of that repository, run git annex sync to update it.
Here's a way to get from a starting point of two or more peer directory trees not tracked by git or git-annex, to the point where they can be synced in the manner described above: syncing non-git trees with git-annex
Comment by Adam Sat Feb 25 11:02:18 2012

I cam upon git-annex a few months ago. I saw immidiately how it could help with some frustrations I've been having. One in particlar is keeping my vimrc in sync accross multiple locations and platforms. I finally took the time to give it a try after I finally hit my boiling point this morning. I went through the walkthrough and now I have an annax everywhere I need it. git annex sync and my vimrc is up-to-date, simply grand!

Thanks so much for making git-annex, Daniel Wozniak

Comment by Daniel Fri Jan 4 10:45:35 2013
Good for syncing indexes, but if I want to synchronise all data files too (specifically pushing to a remote bare repository), how do I do that?
Comment by Diggory Fri Jan 11 12:52:38 2013
Yes, sync only syncs the git branches, not git-annex data. To sync the date, you can run a command such as git annex copy --to bareremote. You could run that in cron. Or, the assistant can be run as a daemon, and automatically syncs git-annex data.
Comment by joeyh.name Fri Jan 11 14:18:07 2013
Comments on this page are closed.