Skip to content

Instantly share code, notes, and snippets.

@jpawlowski
Last active September 26, 2023 19:54
Show Gist options
  • Save jpawlowski/5248465 to your computer and use it in GitHub Desktop.
Save jpawlowski/5248465 to your computer and use it in GitHub Desktop.
Sync Homebrew installations between Macs via Dropbox
#!/bin/bash
# Sync Homebrew installations between Macs via Dropbox
#
BREW="/usr/local/bin/brew"
# first get local settings
echo "Reading local settings ..."
rm -f /tmp/brew-sync.*
$BREW tap > /tmp/brew-sync.taps
$BREW list > /tmp/brew-sync.installed
# then combine it with list in Dropbox
echo "Reading settings from Dropbox ..."
[ -e ~/Dropbox/Apps/Homebrew/brew-sync.taps ] && cat ~/Dropbox/Apps/Homebrew/brew-sync.taps >> /tmp/brew-sync.taps
[ -e ~/Dropbox/Apps/Homebrew/brew-sync.installed ] && cat ~/Dropbox/Apps/Homebrew/brew-sync.installed >> /tmp/brew-sync.installed
# make the lists unique and sync into Dropbox
echo "Syncing to Dropbox ..."
mkdir -p ~/Dropbox/Apps/Homebrew
cat /tmp/brew-sync.taps | sort | uniq > ~/Dropbox/Apps/Homebrew/brew-sync.taps
cat /tmp/brew-sync.installed | sort | uniq > ~/Dropbox/Apps/Homebrew/brew-sync.installed
# Set taps
echo "Enabling taps ..."
for TAP in `cat ~/Dropbox/Apps/Homebrew/brew-sync.taps`; do
$BREW tap ${TAP} >/dev/null
done
# Install missing Homebrew packages
echo "Install missing packages ..."
for PACKAGE in `cat ~/Dropbox/Apps/Homebrew/brew-sync.installed`; do
$BREW list ${PACKAGE} >/dev/null
[ "$?" != "0" ] && $BREW install ${PACKAGE}
done
@witt3rd
Copy link

witt3rd commented Oct 18, 2015

This is a great little script. I added cask syncing to my fork.

@roynasser
Copy link

Sorry for the ignorance, but will this sync both ways? Should I do something in preparation? I understand ghis is a one-time sync, right?

I'm looking at a way to keep my 2 macs as "identical as possible"... this involves shared document folders, as well as trying to get all sorts of apps synced... not a trivial chore it seems...

@justinkiner
Copy link

Very helpful. I forked @witt3rd's gist and added brew update so that the cask file is not filled with update/migration messages, along with changing the directory where the items are stored.

@yekki
Copy link

yekki commented Feb 25, 2017

Enabling taps ...
Updating Homebrew...
Error: Invalid tap name '==>'
Updating Homebrew...
Error: Invalid tap name 'Auto-updated'
Updating Homebrew...
Error: Invalid tap name 'Homebrew!'
Error: Invalid tap name '==>'
Error: Invalid tap name 'Deleted'
Error: Invalid tap name 'Formulae'
Error: Invalid tap name '==>'
Error: Invalid tap name 'Updated'
Error: Invalid tap name 'Formulae'
Error: Invalid tap name 'Updated'
Error: Invalid tap name '1'
Error: Invalid tap name 'tap'

What matter with those?

@NathanielMichael
Copy link

NathanielMichael commented Sep 21, 2017

Look in to using brew bundle instead, not only does it combine taps/brews/casks into one Brewfile but it also saves the arguments the brews were installed with, for example brew install gnu-sed --with-default-names gets represented as brew "gnu-sed", args: ["with-default-names"] in the Brewfile.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment