This problem was solved ages ago. I saw the implemention in Steve Purcell's emacs.d about ten years ago.
The solution uses only Emacs built in package system.
Once it's set up, you don't need manually run
M-x package-install-file from time to time. It won't change your daily workflow to install/upgrade packages.
Step 1, create a local package repository containing old version of packages.
archive-contents and "magit-1.4.2.tar" into
archive-contents is like,
(magit . [(1 4 2) nil "blah blah" tar])
Step 2, add below content into
(push (cons "localelpa" "~/.emacs.d/localelpa/") package-archives)
(defun my-package--add-to-archive-contents-hack (orig-func &rest args)
(let* ((package (nth 0 args))
(archive (nth 1 args))
(pkg-name (car package))
;; (version (package--ac-desc-version (cdr package)))
(add-to-p (or (string= archive "localelpa")
(not (string-match-p "^magit" (format "%s" pkg-name))))))
(if add-to-p (apply orig-func args))))
(advice-add 'package--add-to-archive-contents :around #'my-package--add-to-archive-contents-hack)