How can I set up emacs to automatically git commit every time I save an open file or periodically?
If you wanted to commit upon every save, you'd do:
(add-hook 'after-save-hook 'my-commit-on-save) (defun my-commit-on-save () "commit the buffer" ...your-code-goes-here...)
Likely you could just use
(defun my-commit-on-save () "commit the buffer" (call-interactively 'vc-next-action))
But, you'll want to add some checks to make sure it's a part of the set of files you want to commit, otherwise every buffer you save will be added to a repository.
Here is a bit of lisp that I found. Does not do commit/push on every save, but schedules it for the near future so if you save a bunch of small edits you don't get a bunch of small commits.
;; Automatically add, commit, and push when files change. (defvar autocommit-dir-set '() "Set of directories for which there is a pending timer job") (defun autocommit-schedule-commit (dn) "Schedule an autocommit (and push) if one is not already scheduled for the given dir." (if (null (member dn autocommit-dir-set)) (progn (run-with-idle-timer 10 nil (lambda (dn) (setq autocommit-dir-set (remove dn autocommit-dir-set)) (message (concat "Committing org files in " dn)) (shell-command (concat "cd " dn " && git commit -m 'Updated org files.'")) (shell-command (concat "cd " dn " && git push & /usr/bin/true"))) dn) (setq autocommit-dir-set (cons dn autocommit-dir-set))))) (defun autocommit-after-save-hook () "After-save-hook to 'git add' the modified file and schedule a commit and push in the idle loop." (let ((fn (buffer-file-name))) (message "git adding %s" fn) (shell-command (concat "git add " fn)) (autocommit-schedule-commit (file-name-directory fn)))) (defun autocommit-setup-save-hook () "Set up the autocommit save hook for the current file." (interactive) (message "Set up autocommit save hook for this buffer.") (add-hook 'after-save-hook 'autocommit-after-save-hook nil t))
You can also use my git-monitor utility, if especially if you are a Haskell user.