Another strategy you might consider is to save your initi file(s) in git, and include a method that will automatically download your installed packages from elpa on a new machine when necessary. This prevents the need to keep all of the package contents within your repository, but it does require each machine to have access to the elpa site.
I keep the package configuration in a separate configuration, and load that
from within my init file.
Here's the method I use to reload packages that are missing:
;; emacs package manager.
(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.org/packages/")
'("org" . "http://orgmode.org/elpa/"))
(package-initialize)
;; Create a list of the packages currently installed. You can use the
;; contents of the directory in which they are stored (usually
;; ~/.emacs.d/elpa). Ensure you only use the package name, and not any
;; version information.
;; a good way to get a formatted list of the packages loaded is with the
;; following shell command:
;; ls ~/.emacs.d/elpa | sed -e s/-[0-9.].*//
(defvar cm/packages nil
"A list of elpa packages that should be available on startup")
(setq cm/packages
'(
auto-complete
bm
browse-url-dwim
bs-ext
color-moccur
color-theme-sanityinc-solarized
csv-mode
dash
deferred
diminish
dired-hacks-utils
elisp-slime-nav
epl
esh-help
git-commit-mode
git-gutter+
git-rebase-mode
git-timemachine
hc-zenburn-theme
highlight-symbol
hl-sexp
ht
htmlize
igrep
js2-mode
list-utils
magit
markdown-mode
names
org
ox-pandoc
pandoc-mode
paredit
popup
projectile
request
request-deferred
s
smartparens
sqlplus
starter-kit-eshell
string-utils
w3m
windata
))
;; cycle through the package list and prompt to install any missing from
;; the list
(defvar missing-pkgs '())
(defun cm-package-refresh ()
(interactive)
(setf missing-pkgs nil)
(dolist (pkg cm/packages)
(if (not (package-installed-p pkg))
(progn
(add-to-list 'missing-pkgs pkg)
(setq cm-message "Done"))
(setq cm-message "Nothing missing")))
;; for any missing packages, ask to load them all
(if (and (> (length missing-pkgs) 0)
(y-or-n-p-with-timeout
(format "%s %s " "install missing packages:" missing-pkgs) 4 nil))
(dolist (mpkg missing-pkgs)
(package-install mpkg)))
(message "%s" cm-message))
;; now check for missing packages
(if (y-or-n-p-with-timeout "Check packages? " 4 nil)
(cm-package-refresh))
(provide 'emacs-package)