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)
(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))
         (rev (magit-git-string "rev-parse" "HEAD"))
         (link (format "orgit-rev:%s::%s" repo rev))
         (summary (substring-no-properties (magit-format-rev-summary rev)))
         (desc (format "%s (%s)" summary repo)))
    (kill-new (format "[[%s][%s]]" link desc))
    (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: