For many years I’ve used Version-controlled /etc on Linux to track changes. On MacOS there isn’t a location in /etc to put a crontab, and my user crontab is in /var/at/tabs/, so how can I keep it version-controlled?

I solved this problem by writing a wrapper program: crontab-edit.

When run without arguments it sets $EDITOR so that crontab -e runs crontab-edit TEMPORARY_FILE. When run with an argument it:

  • changes directory to a git repository
  • checks that there aren’t any uncommitted changes
  • pulls and pushes to ensure the repository is up to date
  • runs vimdiff CHECKED_IN_FILE TEMPORARY_FILE so you can make the edits in both files (or recover existing edits)
  • commits the changes
  • pulls and pushes so your changes are upstream

There’s a little more complexity around checking whether there are any changes to commit, following symlinks, and creating files if necessary, but overall it’s relatively straightforward.