In the road to track more effectively my habits, and in the context of this article, my programming habits I put together a simple system for tracking the git commits I do on the various projects I'm working on. As always emacs, magit and org-mode make this pretty easy, and that's the reason that I'm so heavily invested in emacs.

For the implementation of the above goal I use the orgit library that enhances the org-link system with links for views in magit. This means that we can create hyperlinks in org-mode documents that lead to specific magit buffers, hence creating links to descriptions of commits, branches, revision etc.

To do so I configured the orgit package, using use-package:

(use-package orgit
:ensure t
:hook (git-commit-post-finish . orgit-capture-after-commit)
:config
(defun orgit-capture-after-commit ()
"Capture the commit into an org-mode file, decided in the approptriate capture template"
(let* ((repo (abbreviate-file-name default-directory))
(summary (substring-no-properties (magit-format-rev-summary rev)))
(desc (format "%s (%s)" summary repo)))
(org-capture nil "g"))))


The important thing here is that we added a hook on finishing a commit, that collects info for the commit, pushes a orgit link for it in the kill-ring and then invokes org-capture. The relevant template under the shortcut "g" is:

("g" "Git commit" entry (file ,org-default-commit-file)
"* %c \n:PROPERTIES:\n:CLOSED: %T\n:END:\n\n"
:immediate-finish t)


Briefly, this template takes the first element of the kill-ring and creates a new entry in the org-default-commit-file with a CLOSED property and an active timestamp. This is important in order to have them showing up in the agenda, which also requires to put the org-default-commit-file in the agenda files.

Now every commit I make in any repo in my computer, using magit, will create an entry like this:

And at the same time I can review all the commits I've done in the agenda: