Emacs + git: auto commit every 5 minutes
How can I set up emacs to automatically git commit every time I save an open file or periodically?
Solution 1:
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.
Solution 2:
I use git-wip for that (see my answer on SO).
Solution 3:
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.
https://gist.github.com/defunkt/449668
;; 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))
Solution 4:
You don't need emacs for that at all. You can write a shell script that uses inotify. It could look like this:
while true; do
inotifywait -e modify FILES...
git commit ....
done
inotifywait is part of inoftify-tools.